回答:
私も同じ問題を抱えていました。Googleが私をここに導きました。残念ながら、これらの答えはどれも役に立たなかったが、最終的に答えを見つけた。それは非常に簡単だ!
admin_enqueue_scripts
、うまくいきました。これを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でテストされました。他のバージョンとは話せません!
最速の方法は、この機能のJSを無効にすることです。しかし、私は、ボックスのスタイルの登録を解除し、マウスやメタボックスの開閉アイコンなしでカスタムスタイルを初期化することをお勧めします。
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()
何も返さないで、スクリプトの実行を終了するためだけにあるべきです。コードを修正します。
ワードプレスの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");
});
また、この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を追加して.handledivを非表示にすることもできます
質問者が正しい答えを選択しなかった限り、この質問は未解決のままであることに気付きました。
JanはAjax経由で保存されるメタボックスの並べ替えを停止する実例を挙げましたが、他の人はJSに関連する提案をしました。
私が理解している限り、あなたがやりたいのはドラッグを無効にすることだけで、それ以上は何もしません。これを行うには、2つのことが必要です。まず、ajaxの保存アクションをインターセプトする関数です。次に、ページの他の場所で機能を殺すことなくJSのドラッグアンドドロップを停止する必要があります。投稿タイプまたは特定のメタボックス。
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。これにより、ドラッグが防止されます。
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にハードコードされています(ソート可能なセットアップ以上のものを実行します)。
いずれにせよ、それが元の質問の解決に役立ったことを願っています。
$('.postbox .hndle').css('cursor','default');
:::: Re:2nd editを追加して、予見可能な将来に回答を更新し続ける必要があります:P