禁用对元框的拖动?


Answers:


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,它为metabox拖动功能(postbox.dev.js:64)提供了支持。这还会将metabox手柄上的光标切换为标准鼠标指针,而不是移动光标(这由下面的brasofilo提供)。

希望这可以帮助!

编辑:我应该补充一点,可能值得遵循此处的其他一些建议并禁用保存metabox订单。这样可以防止因误启用某些功能而造成的混乱。

第二次编辑:为了子孙后代(和将来的Google搜索者)的利益,此修复程序已在WordPress 3.3.1上进行了测试。我不会说其他版本!


当然,对于Q,恕我直言,可以减少+1的麻烦解决方案。而且许多重量级元素都以;)::::加权,我只使用JS,并添加$('.postbox .hndle').css('cursor','default');:::: Re:2nd edit,在可预见的将来,您必须继续更新Answer:P
brasofilo

从JS操作CSS很聪明!我将其添加到我的答案中。
克里斯·范·帕滕

该代码与当前的WordPress 3.9.1兼容-非常好!:)
菲利普(Philipp)2014年

4

最快的方法是为此功能停用JS。但是我认为,最好是还注销该框的样式并初始化自定义样式,而不用鼠标和meta框上的打开/关闭图标的影响。

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

如果您只想禁用对特定自定义帖子类型的特定metabox的拖动,该怎么办?
NetConstructor.com 2010年

4
此方法有效,但也会禁用其他功能,例如发布状态
fxfuture 2010年

我认为是,但我不对此进行测试。您可以使用Adminimize插件隐藏它,这是一种简便的方法。
bueltge 2010年

1
好一个!我们如何admin_init只在某些特定的帖子类型中发送它?
brasofilo

1
起初似乎是一个完美的解决方案-但可惜-这也禁用了添加类别/分类法的所有功能...
ptriek 2013年

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');
   }
}

谢谢Jan-我将此添加到我的functions.php中,但是它什么都不做?
fxfuture

@fxfuture:愚蠢的我,check_ajax_referer是一个动作,而不是一个过滤器。您应该在die()那里结束脚本执行,而不返回任何内容。我会修复我的代码。
Jan Fabry

是的,您的更正无法正常进行。或者,由于某些原因,FireFox和Chrome正在缓存页面。:/
Zack

3

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");
});

2

我还要添加此Javascript Hack:

<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

0

我发现这个问题一直没有解决,因为提问者没有选择正确的答案。

Jan给出了一个工作示例,该示例停止了通过Ajax保存metabox的重新排序,而其他人则提供了有关JS的建议。

据我了解,您要做的就是禁用拖动,仅此而已。为此,您需要做两件事,首先是拦截ajax保存操作的函数,其次,您还需要停止JS拖放,而不会杀死页面中其他任何地方的功能,同时还需要为帖子类型或特定的metabox。

使用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;
}

上面引用的Javascript文件的jQuery / JS

非常基本的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(3.9.1)
Philipp 2014年

0

要添加到所有先前的答案中,如果您还想防止WordPress加载自定义职位,则应使用以下技巧(post用任何帖子类型替换):

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

0

刚刚找到了简单的方法,希望新的求职者对此有所帮助。假设您可以在admin enqueue样式上添加一个css文件,我只使用css来做到这一点,对不起我的英语不好。

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

希望能帮助到你。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.