Відповіді:
У мене була така ж проблема, і Google привів мене сюди. На жаль, жодна з цих відповідей не допомогла, але я врешті-решт зрозумів відповідь, і це досить просто!
admin_enqueue_scripts
, і це спрацювало чудово.Вимкніть функцію сортування, помістивши це у цей файл 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. Я не можу спілкуватися з іншими версіями!
Найшвидший спосіб - відключити JS для цієї функції. Але я думаю, що краще, коли ти також скасуєш стиль для поля та запустиш власний стиль без ефектів для миші та піктограми відкриття / закриття на метаполе.
function fb_remove_postbox() {
wp_deregister_script('postbox');
}
add_action( 'admin_init', 'fb_remove_postbox' );
admin_init
лише в якомусь конкретному типі посту?
Я відповів на подібне запитання з пропозицією дозволити перетягування, але відключити збереження нового порядку на стороні сервера. Це може дати вам більший контроль та більш надійний, оскільки 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');
}
}
check_ajax_referer
це дія, а не фільтр. Вам слід просто die()
там закінчити виконання сценарію, а не повертати нічого. Я виправлю код.
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");
});
Я також додав би цей злом Javascript:
<script type='text/javascript'>
jQuery(document).ready(function ($) {
$('.handlediv').remove();
});
</script>
... і цей CSS:
.postbox .hndle:hover {
cursor:default;
}
Я використовував цей код, щоб скористатися мета-полями, але без функцій перетягування та відкриття / закриття.
.postbox:hover .handlediv { display:none; }
в CSS, щоб приховати .handlediv
Я помітив, що це питання залишається без відповіді, наскільки запитувач не обрав правильної відповіді.
Ян наводив робочий приклад припинення збереження перетворення метабоксу на Ajax, тоді як інші давали пропозиції щодо JS.
Наскільки я розумію, все, що ви хочете зробити, - це відключити перетягування, більше нічого. Для цього вам знадобляться дві речі, по-перше, функція для перехоплення дії збереження ajax, але по-друге, вам також потрібно припинити перетягування та падіння JS, не вбиваючи функціональності в іншому місці сторінки, а також робити це вибірково для тип публікації або конкретний метаполе.
Використовуючи функцію Jans та деякі jQuery, ми можемо це зробити, не повністю знищуючи іншу функціональність, яку створює скрипт поштової скриньки.
Відмініть 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, який видаляє клас сортування метабокса з придатних елементів, це запобігає перетягуванню.
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 завантажувати власні позиції, слід виконати трюк (замінити post
будь-який тип публікації):
add_filter( 'get_user_option_meta-box-order_post', '__return_empty_string' );
Щойно знайшов простий спосіб, сподіваюся, що новий шукач допоможе в цьому. Якщо припустити, що ви можете додати файл css у стилі enqueue адміністратора, я використовую лише css, щоб зробити це і вибачте за свою погану англійську мову.
.postbox#your-metabox-id .ui-sortable-handle {
pointer-events: none;
}
Сподіваюся, це допомагає.
$('.postbox .hndle').css('cursor','default');
:::: Re: другий редагування , вам доведеться постійно оновлювати відповідь в доступному для огляду майбутньому: P