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


17

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

回答:


13

私も同じ問題を抱えていました。Googleが私をここに導きました。残念ながら、これらの答えはどれも役に立たなかったが、最終的に答えを見つけた。それは非常に簡単だ!

  1. まず、JavaScriptファイルをキューに入れます(このプロセスを再ハッシュすることはありません。このプロセスを説明するチュートリアルはたくさんあります)。に夢中になりましたがadmin_enqueue_scripts、うまくいきました。
  2. これをJavaScriptファイルに配置して、ソート機能を無効にします。

    jQuery(document).ready( function($) {
        $('.meta-box-sortables').sortable({
            disabled: true
        });
    
        $('.postbox .hndle').css('cursor', 'pointer');
    });
    

基本的に、これはメタボックスのドラッグ機能(postbox.dev.js:64)を強化するjQuery UI Sortableを無効にします。これにより、メタボックスハンドルのカーソルが、移動カーソルの代わりに標準のマウスポインターに切り替わります(下のbrasofiloの好意による)。

お役に立てれば!

編集:ここで他のアドバイスのいくつかを実行し、メタボックスの順序の保存を無効にする価値があると付け加えます。偶然に何かが誤って再び有効になった場合の混乱を防ぎます。

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


もちろん、Qの+1の手間がかからないソリューションです。;)::::すべてにJSのみを使用し、$('.postbox .hndle').css('cursor','default');:::: Re:2nd editを追加して、予見可能な将来に回答を更新し続ける必要があります:P
ブラソフィロ

JSからCSSを操作するのは賢明です!それを答えに追加します。
クリスヴァンパッテン

このコードは、現在のWordPress 3.9.1で動作しています-非常に素晴らしい!:)
フィリップ14

4

最速の方法は、この機能のJSを無効にすることです。しかし、私は、ボックスのスタイルの登録を解除し、マウスやメタボックスの開閉アイコンなしでカスタムスタイルを初期化することをお勧めします。

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

特定のカスタム投稿タイプで特定のメタボックスのドラッグを無効にしたい場合はどうでしょうか?
NetConstructor.com

4
この作品が、それはまた、他のポストの状態のような機能を無効にします
fxfuture

はい、と思いますが、これはテストしません。プラグインAdminimizeを使用して簡単に非表示にできます。
bueltge

1
良いですね!admin_init特定の投稿タイプでのみどのようにディスパッチしますか?
ブラソフィロ

1
最初は完璧なソリューションに見えましたが、
残念ながら

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()何も返さないで、スクリプトの実行を終了するためだけにあるべきです。コードを修正します。
1月ファブリー

修正は機能しません。または、FireFoxとChromeが何らかの理由でページをキャッシュしています。:/
ザック

3

ワードプレスのjavascriptは、「hndle」のクラスを持つh3タイトルでドラッグ可能なメタボックスを識別します。問題のメタボックスを参照して(カスタムメタボックスを作成している場合は識別子を割り当てます)、クラス名を削除するか名前を変更して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を非表示にすることもできます
-ptriek

0

質問者が正しい答えを選択しなかった限り、この質問は未解決のままであることに気付きました。

JanはAjax経由で保存されるメタボックスの並べ替えを停止する実例を挙げましたが、他の人はJSに関連する提案をしました。

私が理解している限り、あなたがやりたいのはドラッグを無効にすることだけで、それ以上は何もしません。これを行うには、2つのことが必要です。まず、ajaxの保存アクションをインターセプトする関数です。次に、ページの他の場所で機能を殺すことなく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つの投稿タイプの例を追加しました。この場合は予約します。ただし、特定のメタボックスに対して無効にする可能性もあると述べました。

それを行うことができます、それらの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にハードコードされています(ソート可能なセットアップ以上のものを実行します)。

いずれにせよ、それが元の質問の解決に役立ったことを願っています。


注:このコードは、現在のバージョンのWordPress(3.9.1)
フィリップ14

0

以前のすべての回答に追加するために、WordPressがカスタムポジションをロードしないようにしたい場合は、次の手順を実行する必要があります(postすべての投稿タイプに置き換えます)。

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

0

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

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

それが役に立てば幸い。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.