web-dev-qa-db-ja.com

標準ページ属性メタボックスにカスタムオプションを追加する

既存の標準のPage Attributes Meta Boxに簡単なチェックボックスオプションを追加したいと思います。

私の1つの新しいオプションに新しいメタボックスを登録するのではなく、WordPress APIを使用してそれを行うための明白な/意図した方法はありますか?

3
mikkelbreum

残念ながら違います。唯一の方法は、メタボックスを登録解除してから再登録することです。オリジナルのメタボックスを模倣する独自のコールバック関数を提供します。

この方法は、次の記事で概説されています。

別の方法として、次に示すようにjavascriptを使用してオプションを挿入することもできます。

4
Stephen Harris

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>'; 
}
1
brasofilo

こちらのサイトでは、これについて多くの質問があります。これは 検索 、Google 検索 などです。

また、 実用例git rebo )も必要に応じて使用し、変更できます。

0
bueltge