Schaltet die Admin-Metabox basierend auf der ausgewählten Seitenvorlage um

18

Ich möchte, dass eine benutzerdefinierte Feldoberfläche nur angezeigt wird, wenn einer bestimmten WordPress-Seite eine bestimmte Vorlage zugewiesen ist.

Irgendwelche Ideen?

Jonathan Wold
quelle
Wenn es nicht 'live' sein muss (dh wenn die Seitenvorlage geändert werden muss, muss die Metabox nicht sofort angezeigt / ausgeblendet werden), lesen Sie diese verwandte Frage: wordpress.stackexchange.com/questions/48611/…
Stephen Harris
@ Stephen Harris Danke für den Kommentar. Ich bin mit der WPAlchemy-MetaBox-Klasse fertig geworden, die im Setup die Option "Pro Vorlage" enthält.
Jonathan Wold

Antworten:

22

Der beste Weg, um sich dieser Situation zu nähern, ist JavaScript. Auf diese Weise können Sie bei jeder Änderung des ausgewählten Werts die zugehörige Metabox sofort ausblenden / anzeigen.

Verwenden Sie wp_enqueue_script()in functions.php, um eine benutzerdefinierte JavaScript-Datei im Admin-Bereich zu laden:

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'));
}

Das Skript selbst, für das jQuery erforderlich ist, blendet einfach eine Metabox basierend auf dem ausgewählten Wert in der Dropdown-Liste der Seitenvorlagen aus oder zeigt sie an. In diesem Beispiel zeige ich nur die Metabox für Post-Thumbnails an, wenn die Standardseitenvorlage ausgewählt ist:

(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);

Und aus Spaß ist hier eine kürzere, weniger ausführliche Version desselben Skripts:

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

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

});
})(jQuery);
Geert
quelle
Wow Danke! Ich werde dies bald testen und dementsprechend berichten.
Jonathan Wold
So toll ... das ist genau das, was ich brauchte. Arbeitete perfekt für mich. Vielen Dank!!!
Ross
Tut mir leid, aber ich bin ein echter Anfänger in Javascript und ich weiß, was ich brauche, aber es scheint, dass ich nicht in der Lage bin, die Dinge richtig zu machen ... Also bin ich mir nicht sicher, was ich verstehen soll Ich muss die Javascript-Datei ändern. Ist es möglich, mehr Erklärungen für einen Nooby wie mich zu haben? ;)
1

Anstatt die Metabox nur zu rendern, um sie mit jQuery auszublenden, können Sie dies verwenden. Der einzige Unterschied besteht darin, dass das Ein- und Ausblenden der Metabox nach dem Ändern des Dropdown-Felds die Auswahl von "Aktualisieren" erfordert.

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' );

Aktualisieren Sie einfach die Zeilen 6 und 7 wie gewünscht.

Davidcondrey
quelle