Вимкнути перетягування метаполе?


17

Хтось знає, як відключити цю функціональність, щоб метабокси не могли бути переставлені?

Відповіді:


13

У мене була така ж проблема, і Google привів мене сюди. На жаль, жодна з цих відповідей не допомогла, але я врешті-решт зрозумів відповідь, і це досить просто!

  1. По-перше, застосуйте файл JavaScript (я не буду повторно переробляти цей процес; є багато підручників, які можуть описати цей процес краще, ніж я). Я зачепився admin_enqueue_scripts, і це спрацювало чудово.
  2. Вимкніть функцію сортування, помістивши це у цей файл JavaScript:

    jQuery(document).ready( function($) {
        $('.meta-box-sortables').sortable({
            disabled: true
        });
    
        $('.postbox .hndle').css('cursor', 'pointer');
    });

По суті, це просто відключає jQuery UI Sortable , який забезпечує функцію перетягування метабокса ( postbox.dev.js: 64 ). Це також перемикає курсор на ручці метабокса на стандартний вказівник миші замість курсору переміщення (ідея люб’язності брасофіло нижче).

Сподіваюся, це допомагає!

Редагувати: Я повинен додати, що, напевно, варто дотримуватися деяких інших порад тут і відключити збереження порядку метабокса. Це запобіжить плутанину щодо випадкових випадків, коли щось помилково повторно увімкнеться.

Друга редакція: для користі майбутніх поколінь (та майбутніх пошукачів Google) це виправлення було випробувано на WordPress 3.3.1. Я не можу спілкуватися з іншими версіями!


+1 менше безпроблемного рішення для Q, IMHO, звичайно. І багато важкоатлетів в врівноважених;) :::: Я використовую тільки JS для всіх, додаючи $('.postbox .hndle').css('cursor','default');:::: Re: другий редагування , вам доведеться постійно оновлювати відповідь в доступному для огляду майбутньому: P
brasofilo

Маніпулювати CSS від JS розумно! Я додам це до своєї відповіді.
Кріс Ван Паттен

Цей код працює з поточним WordPress 3.9.1 - дуже приємно! :)
Філіп

4

Найшвидший спосіб - відключити JS для цієї функції. Але я думаю, що краще, коли ти також скасуєш стиль для поля та запустиш власний стиль без ефектів для миші та піктограми відкриття / закриття на метаполе.

function fb_remove_postbox() {
    wp_deregister_script('postbox');
}
add_action( 'admin_init', 'fb_remove_postbox' );

що робити, якщо ви просто хочете відключити перетягування для певного метаполе для певного користувальницького типу публікації?
NetConstructor.com

4
Це працює, але також вимикає інші функції, такі як статус публікації
fxfuture

Я думаю, що так, але я не перевіряю це. Ви можете сховатися за допомогою плагіна Adminimize як простий спосіб.
Бульгеж

1
Хороший! Як ми можемо відправити це admin_initлише в якомусь конкретному типі посту?
brasofilo

1
спочатку здавалося ідеальним рішенням, але на жаль - це також вимикає всі функціональні можливості для додавання категорії / систематики ...
ptriek

4

Я відповів на подібне запитання з пропозицією дозволити перетягування, але відключити збереження нового порядку на стороні сервера. Це може дати вам більший контроль та більш надійний, оскільки JavaScript може швидко змінюватися, але протокол для спілкування з сервером може залишатися більш надійним. Цей приклад вимикає всі перетягування, але ви можете розширити його, щоб перевірити вашу конкретну вікно або мета-сторінку.

add_action('check_ajax_referer', 'prevent_meta_box_order');
function prevent_meta_box_order($action)
{
   if ('meta-box-order' == $action /* && $wp_user == 'santa claus' */) {
      die('-1');
   }
}

Дякую Ян - я додав це до своїх функцій.php, але він нічого не робить?
fxfuture

@fxfuture: Дурний мене, check_ajax_refererце дія, а не фільтр. Вам слід просто die()там закінчити виконання сценарію, а не повертати нічого. Я виправлю код.
Ян Фабрі

Так, ваше виправлення не працює. Або FireFox і Chrome чомусь кешують сторінку. : /
Зак

3

Wordpress javascript ідентифікує метабокси, що перетягуються, за своїм заголовком h3 з класом "hndle". Досить просто їх відключити, зокрема, посилаючись на відповідний метабокс (якщо ви створюєте власні метабокси, вам буде призначений ідентифікатор) та відключити будь-які класи, видаляючи ім'я класу або перейменувавши його. У моєму випадку у мене є декілька типів розділювачів, які я позначав .hndle h3, але навряд чи хтось зробив би так. Отже, ви можете робити те, що я зробив нижче, або ви можете використовувати .find ('. Hndle'). Attr ('class', '') .... або щось подібне. Це буде міститись у .js-файлі, який ви ввели у файл function.php (будь то в папці з темами чи у папці плагінів). Запитання буде викликано admin_print_scripts,

jQuery("#MY_METABOX_ID h3.hndle").each(function(e){
jQuery(this).attr("class", "hndlle");
});

2

Я також додав би цей злом Javascript:

<script type='text/javascript'>
    jQuery(document).ready(function ($) {
        $('.handlediv').remove();
    });
</script>

... і цей CSS:

.postbox .hndle:hover {
    cursor:default;
}

Я використовував цей код, щоб скористатися мета-полями, але без функцій перетягування та відкриття / закриття.


Гарне доповнення до відповіді @bueltge (я використовував комбінацію обох) - хоча ви також можете пропустити біт jQuery і додати .postbox:hover .handlediv { display:none; }в CSS, щоб приховати .handlediv
ptriek

0

Я помітив, що це питання залишається без відповіді, наскільки запитувач не обрав правильної відповіді.

Ян наводив робочий приклад припинення збереження перетворення метабоксу на Ajax, тоді як інші давали пропозиції щодо JS.

Наскільки я розумію, все, що ви хочете зробити, - це відключити перетягування, більше нічого. Для цього вам знадобляться дві речі, по-перше, функція для перехоплення дії збереження ajax, але по-друге, вам також потрібно припинити перетягування та падіння JS, не вбиваючи функціональності в іншому місці сторінки, а також робити це вибірково для тип публікації або конкретний метаполе.

Використовуючи функцію Jans та деякі jQuery, ми можемо це зробити, не повністю знищуючи іншу функціональність, яку створює скрипт поштової скриньки.

PHP-код для файлу функцій теми або файлу плагіна

Відмініть 1 відповідних рядків, щоб змусити роботу працювати.

add_action( 'admin_enqueue_scripts' , 'disable_metabox_dragging' );
add_action( 'check_ajax_referer',     'disable_metabox_ordering' );

function disable_metabox_dragging( $hook ) {

    if( !in_array( $hook, array( 'post.php', 'post-new.php' ) ) )
        return;

    global $post_type;
    if( !in_array( $post_type, array( 'book' ) ) )
        return;

    // Uncomment the following line if using inside a child theme
    //wp_enqueue_script( 'unsortable-meta', trailingslashit( get_stylesheet_directory_uri() ) . 'unsortable-metaboxes.js', array(), false );

    // Or uncomment the following line if using inside a parent theme
    //wp_enqueue_script( 'unsortable-meta', trailingslashit( get_template_directory_uri() ) . 'unsortable-metaboxes.js', array(), false );

    // Or ncomment the following line if using inside a plugin file
    //wp_enqueue_script( 'unsortable-meta', plugins_url( '/unsortable-metaboxes.js', __FILE__ ), array(), false );
}

function disable_metabox_ordering($action) {

    global $post_type;
    if( !in_array( $post_type, array( 'book' ) ) )
        return;

    if( 'meta-box-order' == $action )
        die;
}

jQuery / JS для файлу Javascript, на який посилається вище

Дуже основний jquery, який видаляє клас сортування метабокса з придатних елементів, це запобігає перетягуванню.

jQuery(document).ready(function($){
    $('.meta-box-sortables').removeClass('meta-box-sortables');
});

Як ви бачите, я додав в одному прикладі типу публікації, щоб додати код, в цьому випадку забронюйте. Однак ви згадали, що хочете також мати можливість відключити його для конкретних метаполев.

Це може бути зроблено, є лише кілька невеликих побічних ефектів, одна з таких, що, видаляючи класи з заданих метабок для запобігання перетягуванню, ви також запобігаєте роботі функції перемикання (тобто функція перемикання заголовка метабокса).

Однак, це можна зробити ...

По-перше, ви оновите disable_metabox_draggingфункцію до ..

function disable_metabox_dragging( $hook ) {

    if( !in_array( $hook, array( 'post.php', 'post-new.php' ) ) )
        return;

    global $post_type;
    if( !in_array( $post_type, array( 'book' ) ) )
        return;

    // Uncomment the following line if using inside a child theme
    // wp_enqueue_script( 'some-unsortables', trailingslashit( get_stylesheet_directory_uri() ) . 'unsortable-somemetaboxes.js', array('postbox') );

    // Or uncomment the following line if using inside a parent theme
    //wp_enqueue_script( 'some-unsortables', trailingslashit( get_template_directory_uri() ) . 'unsortable-somemetaboxes.js', array('postbox') );

    // Or uncomment the following line if using inside a plugin file
    //wp_enqueue_script( 'some-unsortables', plugins_url( '/unsortable-somemetaboxes.js', __FILE__ ), array('postbox') );

    wp_localize_script( 'some-unsortables', 'NonDragMetaboxes', array( 0 => '', 'postcustom', 'postexcerpt' ) );
}

Знову ж таки, зазначивши, що вам потрібно відміняти відповідний wp_enqueue_scriptрядок.

Масив всередині виклику локалізації - це те, що визначає, які метабокси відключити, порожній елемент із клавішею 0 є цілеспрямовано, оскільки функція локалізації сценарію позбавляє будь-яких 0 ключевих індексів у масиві.

По-друге, новий JS-файл, на який посилається вищевказана функція enqueue.

jQuery(document).ready(function($){
    // For each item in the JS array created by the localize call
    $.each( NonDragMetaboxes, function(index,value) {

        // Remove postbox class(disables drag) and add stuffbox class(styling is close to the original)
        $( '#' + value ).removeClass('postbox').addClass('stuffbox');

        // Remove redundant handle div
        if( $( '#' + value ).has('.handlediv') )
            $( '#' + value ).children('.handlediv').remove();

        // Remove redundant cursor effect on hover
        if( $( '#' + value ).has('h3') )
            $( '#' + value ).children('h3').css('cursor','default');
    } );
});

Єдине, що вам потрібно зробити, - це визначити ідентифікатор метабоксів, які ви хочете приховати, і передати їх у масив, який встановлює відключені метабокси (у wp_localize_sciptвиклику).

В цілому, я не думаю, що вибіркове відключення метабоків не має недоліків, просто немає підтримки для перенастроювання дії сортування init в WordPress, тому відключення сортування метабок на основі елементів буде в кращому випадку гакітним (мій код вище - докази цього). В ідеалі, тут потрібна дія в WordPress, щоб підключити ініціативу для сортування, але це в даний час жорстко закодовано у javascript поштової скриньки (що робить більше, ніж просто налаштування сортування).

У будь-якому випадку, я сподіваюся, що це допомогло вирішити оригінальне питання.


Примітка. Цей код більше не працює з поточною версією WordPress (3.9.1)
Philipp

0

Щоб додати до всіх попередніх відповідей, якщо ви також хочете не дозволити WordPress завантажувати власні позиції, слід виконати трюк (замінити postбудь-який тип публікації):

add_filter( 'get_user_option_meta-box-order_post', '__return_empty_string' );

0

Щойно знайшов простий спосіб, сподіваюся, що новий шукач допоможе в цьому. Якщо припустити, що ви можете додати файл css у стилі enqueue адміністратора, я використовую лише css, щоб зробити це і вибачте за свою погану англійську мову.

.postbox#your-metabox-id .ui-sortable-handle {
    pointer-events: none;
}

Сподіваюся, це допомагає.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.