web-dev-qa-db-ja.com

選択したページテンプレートに基づいて管理メタボックスを切り替え

特定のテンプレートが特定のWordPressページに割り当てられているときに、カスタムフィールドインターフェースにonlyを表示させたいのですが。

何か案は?

18
Jonathan Wold

この状況に対処する最善の方法は、JavaScriptを使用することです。このようにして、選択した値が変わるたびに、関連するメタボックスを即座に隠したり表示したりできます。

管理領域にカスタムJavaScriptファイルをロードするには、functions.phpwp_enqueue_script() を使用します。

add_action('admin_enqueue_scripts', 'my_admin_script');
function my_admin_script()
{
    wp_enqueue_script('my-admin', get_bloginfo('template_url').'/my-admin.js', array('jquery'));
}

JQueryを必要とするスクリプト自体は、ページテンプレートのドロップダウンリストで選択した値に基づいてメタボックスを非表示にするか表示するだけです。この例では、デフォルトのページテンプレートが選択されている場合の投稿サムネイルのメタボックスのみを表示しています。

(function($){
$(document).ready(function() {

    var $page_template = $('#page_template')
        ,$metabox = $('#postimagediv'); // For example

    $page_template.change(function() {
        if ($(this).val() == 'default') {
            $metabox.show();
        } else {
            $metabox.hide();
        }
    }).change();

});
})(jQuery);

そして、ちょっとした楽しみのために、ここでは同じスクリプトの短くて冗長ではないバージョンを示します。

(function($){
$(function() {

    $('#page_template').change(function() {
        $('#postimagediv').toggle($(this).val() == 'default');
    }).change();

});
})(jQuery);
22
Geert

メタベースをjQueryで非表示にするためだけにレンダリングするのではなく、これを使用できます。唯一の違いは、メタボックスの非表示/表示にはドロップダウンフィールドを変更した後に[更新]を選択する必要があることです。

function add_meta_box() {
    global $post;
    if(!empty($post)) {
        $pageTemplate = get_post_meta($post->ID, '_wp_page_template', true);

        if($pageTemplate == 'your-page-template-here.php' ) {
            add_meta_box( $id, $title, $callback, 'page', $context, $priority, $callback_args );
        }
    }
}
add_action( 'add_meta_boxes', 'add_meta_box' );

必要に応じて6行目と7行目を更新するだけです。

1
davidcondrey