我注意到这个问题仍然没有答案,因为提问者没有选择正确的答案。
Jan给出了一个阻止通过Ajax保存metabox重新排序的工作示例,而其他人则给出了与JS相关的建议。
据我所知,您只想禁用拖动,仅此而已。要做到这一点,您需要做两件事,首先是一个拦截ajax保存操作的函数,但其次还需要停止JS的拖放,而不会破坏页面中其他任何地方的功能,同时还要有选择地对帖子类型或特定元框执行此操作。
通过使用Jans函数和一些jQuery,我们可以做到这一点,而不会完全破坏postbox脚本创建的其他功能,例如。。
主题函数文件或插件文件的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从可应用的元素中删除metabox可排序类,这可以防止拖动。
jQuery(document).ready(function($){
$(\'.meta-box-sortables\').removeClass(\'meta-box-sortables\');
});
如您所见,我在1个示例post type中添加了代码,本例中为book。但是,您提到希望还可以为特定的代谢箱禁用它。
这是可以做到的,只是有一些小的副作用,其中之一是,通过从给定的元框中删除类以防止拖动,您也可以防止切换功能工作(即元框标题切换功能)。
也就是说,这是可以做到的。。。
首先,您要更新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
线
localize调用中的数组决定了要禁用哪些元盒,因为localize脚本函数会删除数组中的任何0键索引,所以有目的地存在空的0键项目。
第二,上面调整的enqueue函数中引用的新JS文件。
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\');
} );
});
唯一需要做的是确定要隐藏的元盒的ID,并将其传递到设置禁用元盒的数组中(在
wp_localize_scipt
电话)。
总的来说,我认为有选择地禁用元盒并不缺乏缺点,只是不支持在WordPress中重新配置可排序的init操作,所以在每个元素的基础上禁用元盒排序最多只能算是黑客行为(我上面的代码就是证明)。理想情况下,这里需要的是WordPress中的一个操作来钩住可排序init,但这目前已硬编码到邮箱javascript中(它不仅仅用于设置可排序)。
无论如何,我希望这有助于解决最初的问题。