Answers:
我遇到了同样的问题,而Google带领我来到了这里。不幸的是,这些答案都没有帮助,但我最终找到了答案,这很容易!
admin_enqueue_scripts
,它工作正常。通过将排序功能放到该JavaScript文件中来禁用排序功能:
jQuery(document).ready( function($) {
$('.meta-box-sortables').sortable({
disabled: true
});
$('.postbox .hndle').css('cursor', 'pointer');
});
本质上,这只是禁用了jQuery UI Sortable,它为metabox拖动功能(postbox.dev.js:64)提供了支持。这还会将metabox手柄上的光标切换为标准鼠标指针,而不是移动光标(这由下面的brasofilo提供)。
希望这可以帮助!
编辑:我应该补充一点,可能值得遵循此处的其他一些建议并禁用保存metabox订单。这样可以防止因误启用某些功能而造成的混乱。
第二次编辑:为了子孙后代(和将来的Google搜索者)的利益,此修复程序已在WordPress 3.3.1上进行了测试。我不会说其他版本!
最快的方法是为此功能停用JS。但是我认为,最好是还注销该框的样式并初始化自定义样式,而不用鼠标和meta框上的打开/关闭图标的影响。
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”类来标识可拖动的metabox。通过引用有问题的metabox(如果您正在创建自定义metabox,您将为其分配一个标识符)并通过删除类名或重命名来禁用任何hndle类,就可以简单地禁用它们。就我而言,我有几种用.hndle h3标记的分隔符类型,但其他任何人不太可能以这种方式完成操作。因此,您可以做下面的事情,或者可以使用.find('。hndle')。attr('class','')....或类似的东西。这将放入您在functions.php文件中排队的.js文件中(无论是在主题文件夹中还是在插件文件夹中)。排队将由admin_print_scripts调用,
jQuery("#MY_METABOX_ID h3.hndle").each(function(e){
jQuery(this).attr("class", "hndlle");
});
我还要添加此Javascript Hack:
<script type='text/javascript'>
jQuery(document).ready(function ($) {
$('.handlediv').remove();
});
</script>
...以及这个CSS:
.postbox .hndle:hover {
cursor:default;
}
我使用该代码来利用元框,但没有拖放和打开/关闭功能。
.postbox:hover .handlediv { display:none; }
CSS以隐藏
我发现这个问题一直没有解决,因为提问者没有选择正确的答案。
Jan给出了一个工作示例,该示例停止了通过Ajax保存metabox的重新排序,而其他人则提供了有关JS的建议。
据我了解,您要做的就是禁用拖动,仅此而已。为此,您需要做两件事,首先是拦截ajax保存操作的函数,其次,您还需要停止JS拖放,而不会杀死页面中其他任何地方的功能,同时还需要为帖子类型或特定的metabox。
使用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,它从适用元素中删除了metabox可排序类,从而防止了拖动。
jQuery(document).ready(function($){
$('.meta-box-sortables').removeClass('meta-box-sortables');
});
如您所见,我在1个示例帖子类型中添加了代码,请在这种情况下预订。但是,您提到希望也有可能针对特定的metabox禁用它。
可以做到的,只有一些小的副作用,那就是,通过从给定的metabox移除类以防止拖动,您也确实会阻止切换功能工作(即metabox标题切换功能)。
也就是说,可以做到...
首先,将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文件。
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');
} );
});
您只需要确定要隐藏的metabox的ID,然后将它们传递到设置禁用的metabox(在wp_localize_scipt
调用中)的数组中即可。
总的来说,我不认为有选择地禁用metabox没有缺点,只是不支持在WordPress中重新配置可排序的init操作,因此在每个元素的基础上禁用metabox排序充其量是很棘手的(上面我的代码是证明)。理想情况下,这里需要的是WordPress中的一项操作,以挂接可排序的init,但目前已将其硬编码到邮箱javascript中(它不仅可以设置可排序的)。
无论如何,我希望这有助于解决原始问题。
要添加到所有先前的答案中,如果您还想防止WordPress加载自定义职位,则应使用以下技巧(post
用任何帖子类型替换):
add_filter( 'get_user_option_meta-box-order_post', '__return_empty_string' );
刚刚找到了简单的方法,希望新的求职者对此有所帮助。假设您可以在admin enqueue样式上添加一个css文件,我只使用css来做到这一点,对不起我的英语不好。
.postbox#your-metabox-id .ui-sortable-handle {
pointer-events: none;
}
希望能帮助到你。
$('.postbox .hndle').css('cursor','default');
:::: Re:2nd edit,在可预见的将来,您必须继续更新Answer:P