web-dev-qa-db-ja.com

テンプレート選択時に表示されるカスタムメタボックス

可能な重複:
選択したページテンプレートに基づいて管理メタボックスを切り替えます

誰かがドロップダウンからテンプレートを選んだ直後にエディタ画面を変更することは可能ですか?ページテンプレートがpage-portfolio.phpの場合にのみ表示されるメタボックスが必要です。私は私がこのコードを使えることを知っています:

$post_id = $_GET['post'] ? $_GET['post'] : $_POST['post_ID'] ;

$template_file = get_post_meta($post_id,'_wp_page_template',TRUE);

そしてifステートメントを使って私のボックスを追加するよりも。問題はそれがすぐには機能しないことです。ユーザーが保存せずにテンプレートリストを変更したときに「キャッチ」する瞬間を行うための非常に複雑なコーディングがなくてもこれは可能ですか?

1
smogg

私はプラグイン の高度なカスタムフィールド がそれをすることを知っています。コードをチェック して 、私は彼がjQueryを使ってこの問題に対処しているのを見ました。参照としてそれを使用して、私はこれがあなたのために働くべきだと思います:

/* 
 * Change Meta Box visibility according to Page Template
 *
 * Observation: this example swaps the Featured Image meta box visibility
 *
 * Usage:
 * - adjust $('#postimagediv') to your meta box
 * - change 'page-portfolio.php' to your template's filename
 * - remove the console.log outputs
 */

add_action('admin_head', 'wpse_50092_script_enqueuer');

function wpse_50092_script_enqueuer() {
    global $current_screen;
    if('page' != $current_screen->id) return;

    echo <<<HTML
        <script type="text/javascript">
        jQuery(document).ready( function($) {

            /**
             * Adjust visibility of the meta box at startup
            */
            if($('#page_template').val() == 'page-portfolio.php') {
                // show the meta box
                $('#postimagediv').show();
            } else {
                // hide your meta box
                $('#postimagediv').hide();
            }

            // Debug only
            // - outputs the template filename
            // - checking for console existance to avoid js errors in non-compliant browsers
            if (typeof console == "object") 
                console.log ('default value = ' + $('#page_template').val());

            /**
             * Live adjustment of the meta box visibility
            */
            $('#page_template').live('change', function(){
                    if($(this).val() == 'page-portfolio.php') {
                    // show the meta box
                    $('#postimagediv').show();
                } else {
                    // hide your meta box
                    $('#postimagediv').hide();
                }

                // Debug only
                if (typeof console == "object") 
                    console.log ('live change value = ' + $(this).val());
            });                 
        });    
        </script>
HTML;
}
3
brasofilo