既存の標準のPage Attributes Meta Boxに簡単なチェックボックスオプションを追加したいと思います。
私の1つの新しいオプションに新しいメタボックスを登録するのではなく、WordPress APIを使用してそれを行うための明白な/意図した方法はありますか?
残念ながら違います。唯一の方法は、メタボックスを登録解除してから再登録することです。オリジナルのメタボックスを模倣する独自のコールバック関数を提供します。
この方法は、次の記事で概説されています。
別の方法として、次に示すようにjavascriptを使用してオプションを挿入することもできます。
Stephen Harrisは私がその質問を誤解していることを優しく指摘しました。残念ながら、フックできるアクション
post_submitbox_publish_actions
はありません。そのため、私の解決策を機能させるための回避策は、jQueryにチェックボックスを元の配置から移動させることです。これを実現するためのスクリプトを追加しました。
これは、完全にワイルドな試みです。
- このQ&A: Author Metaboxを「Publish」メタボックスに移動する方法
- そしてコーデックスの最初の例: http://codex.wordpress.org/Function_Reference/add_meta_box
私はプラグイン(wp-content/mu-plugins/tests.php
)の中でコードを実行していて、functions.php
..でテストしていません。
それが「正しい」コードであることを保証することはできませんが、私の地元のWordPressでうまくいきます。
add_action( 'post_submitbox_misc_actions', 'wpse_52193_custombox_in_publish' );
add_action( 'save_post', 'wpse_52193_save_postdata' );
add_action( 'admin_head', 'wpse_52193_script_enqueuer');
function wpse_52193_custombox_in_publish() {
global $post;
if ('page' != get_post_type($post)) return;
wp_nonce_field( plugin_basename( __FILE__ ), 'myplugin_noncename' );
$checked = (get_post_meta($post->ID, 'myplugin_new_field',true)) ? 'checked="yes"' : '';
echo '<div id="myplugin_new_field_div" class="misc-pub-section" style="border-top-style:solid; border-top-width:1px; border-top-color:#EEEEEE; border-bottom-width:0px;"><div style="font-weight: bold;">Description for this field:</div>';
echo '<input name="myplugin_new_field" id="myplugin_new_field" type="checkbox" '.$checked.'>';
echo '</div>';
}
function wpse_52193_save_postdata( $post_id ) {
if ( 'page' != $_POST['post_type'] )
return;
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return;
if ( !wp_verify_nonce( $_POST['myplugin_noncename'], plugin_basename( __FILE__ ) ) )
return;
$mydata = $_POST['myplugin_new_field'];
update_post_meta($post_id, 'myplugin_new_field', $mydata);
}
function wpse_52193_script_enqueuer(){
global $current_screen;
if('page' != $current_screen->id) return;
echo '<script type="text/javascript">
jQuery(document).ready( function($) {
$("#myplugin_new_field_div").appendTo("#pageparentdiv");
});
</script>';
}