web-dev-qa-db-ja.com

メタボックスのドラッグを無効にしますか?

メタボックスを再配置できないようにこの機能を無効にする方法を誰かが知っていますか?

16
fxfuture

私は同じ問題を抱えていた、そしてグーグルはここに私を導いた。残念ながらこれらの答えのどれも助けにはなりませんでした、しかし私は最終的に答えを考え出しました、そしてそれは非常に簡単です!

  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 )。これにより、メタボックスハンドル上のカーソルも、移動カーソルではなく標準のマウスポインタに切り替わります( brasofilo のアイデアによる)。

お役に立てれば!

編集: 私はそれがここで他のアドバイスのいくつかに従うこととメタボックス順序の保存を無効にすることがおそらく価値があると付け加えるべきです。それは、何かが誤って再び有効にされてしまうような、偶然の機会に関する混乱を防ぐでしょう。

2回目の編集: 将来の世代(および将来のGoogle検索ユーザー)のために、この修正はWordPress 3.3.1でテストされました。他のバージョンと話すことはできません。

12

最速の方法はこの機能のためにJSを無効にすることです。しかし、ボックスのスタイルの登録を解除して、マウスの効果とメタボックスの開閉アイコンを使用せずにカスタムスタイルを初期化するとよいでしょう。

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

I 同じような質問に答えました ドラッグを許可するという提案がありましたが、 新しい順序の保存を無効にしました サーバー側で。これにより、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');
   }
}
4
Jan Fabry

ワードプレスのJavascriptは "hndle"のクラスでそれらのh3タイトルによってドラッグ可能なメタボックスを識別します。問題のメタボックスを参照して(カスタムメタボックスを作成している場合は識別子を割り当てます)、クラス名を削除するか名前を変更してhndleクラスを無効にすることで、これらを無効にするのは簡単です。私の場合は、.hndle h3でラベル付けしたセパレータタイプがいくつかありますが、他の誰かがこのようにしたことはまずありません。それで、あなたは私が以下でやったことをすることができます、あるいはあなたは.find( '。hndle')。attr( 'class'、 '')....あるいは同様のものを使うかもしれません。これは、自分のfunctions.phpファイルにエンキューした.jsファイルに入ります(それがthemesフォルダーにあるか、pluginsフォルダーにあるかにかかわらず)。エンキューは、admin_print_scripts、init、または管理ページに何かを追加するために使用することを好む任意のフックによって呼び出されます。

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

このJavascript Hackも追加します。

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

...そしてこのCSS:

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

私はそのコードを使ってメタボックスを利用したが、ドラッグアンドドロップや開閉機能は使わなかった。

2
Maxime

WordPressがカスタムポジションを読み込めないようにするには、上記のすべての回答に追加して、次のようにします(postを任意の投稿タイプに置き換えます)。

add_filter( 'get_user_option_meta-box-order_post', '__return_empty_string' );
0
Matthew Boynes

単純な方法を見つけたら、新しいシーカーがこれを手助けしてくれることを願います。あなたが管理エンキュースタイルでCSSファイルを追加することができると仮定して、私はそれをするためにCSSを使用するだけで、私の悪い英語を申し訳ありません。

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

それが役に立てば幸い。

0

私は、質問者が正しい答えを選択していない限り、この質問は未回答のままであることに気づきました。

Janは、Ajaxを介して保存されているメタボックスの並べ替えを停止する実用的な例を示しましたが、他の人はJSに関する提案をしました。

私が理解している限りでは、ドラッグを無効にするだけでいいのです。そのためには2つのことが必要です。1つはajax保存アクションをインターセプトする機能ですが、2つ目はページ内の他の場所で機能を停止させることなく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;
}

上記で参照されているJavascriptファイルのjQuery/JS

メタボックスソート可能クラスを適用可能な要素から削除する非常に基本的なjquery。これはドラッグを防ぎます。

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

ご覧のとおり、コードを追加するために1つのサンプル投稿タイプに追加しました。この場合は予約してください。しかしあなたは、特定のメタボックスに対してそれを無効にする可能性もあることを望んでいると述べました。

それは可能です、ドラッグを防ぐために与えられたメタボックスからクラスを削除することによって、トグル機能が機能するのを防ぐこともできるということです(つまりメタボックスタイトルのトグル機能)。

それはできる、それはできる….

まず、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個のキー付き項目が意図的に存在します。

次に、上記の調整されたエンキュー機能で参照されている新しい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アクションを再設定することはサポートされていない。その証拠)。理想的には、ここで必要とされているのはソート可能なinitをフックするためのWordPressのアクションですが、現在ポストボックスJavaScriptにハードコードされています(これは単にソート可能な設定以上のことをします)。

いずれにせよ、私はそれが元の質問に対処するのに役立つことを願っています。

0
t31os