Chuyển đổi metabox quản trị dựa trên mẫu trang đã chọn


18

Tôi muốn có một trường tùy chỉnh giao diện xuất hiện chỉ khi một mẫu nhất định được gán cho một trang WordPress nói riêng.

Có ý kiến ​​gì không?


Nếu không cần phải 'sống' (nghĩa là thay đổi mẫu trang thì không cần phải làm cho metabox xuất hiện / biến mất ngay lập tức), hãy xem câu hỏi liên quan này: wordpress.stackexchange.com/questions/48611/ Thẻ
Stephen Harris

@StephenHarris Cảm ơn bạn đã bình luận. Tôi cố gắng tiếp tục với lớp MetaBox của WPAlchemy, bao gồm tùy chọn "mỗi mẫu" trong thiết lập.
Jonathan Wold

Câu trả lời:


22

Cách tốt nhất để tiếp cận tình huống này là thông qua JavaScript. Bằng cách đó, bất cứ khi nào giá trị được chọn thay đổi, bạn có thể ẩn / hiển thị metabox liên quan ngay lập tức.

Sử dụng wp_enqueue_script()trong functions.phpđể tải một tập tin JavaScript tùy chỉnh trong lĩnh vực quản trị:

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

Bản thân tập lệnh, yêu cầu jQuery, chỉ cần ẩn hoặc hiển thị một metabox dựa trên giá trị được chọn trong danh sách thả xuống của mẫu trang. Trong ví dụ này, tôi chỉ hiển thị metabox cho hình thu nhỏ của bài đăng trong trường hợp mẫu trang mặc định được chọn:

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

Và, chỉ để giải trí, đây là phiên bản ngắn hơn, ít dài dòng hơn của cùng một kịch bản:

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

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

});
})(jQuery);

Ồ, cảm ơn bạn! Tôi sẽ sớm thực hiện bài kiểm tra này và sẽ báo cáo lại.
Jonathan Wold

Thật tuyệt vời ... đây chỉ là những gì tôi cần. Làm việc hoàn hảo cho tôi. Cảm ơn bạn!!!
Ross

Xin lỗi nhưng tôi là người mới bắt đầu thực sự trong javascript và tôi biết những thứ tôi cần, nhưng có vẻ như tôi không thể làm mọi thứ theo cách chính xác ... Vì vậy, tôi không chắc chắn hiểu những gì Tôi phải thay đổi trong tệp javascript .. Có thể có thêm lời giải thích cho một người không như tôi không? ;)

1

Thay vì chỉ hiển thị metabox để ẩn nó với jQuery, bạn có thể sử dụng cái này. Sự khác biệt duy nhất là việc ẩn / hiển thị metabox yêu cầu chọn 'Cập nhật' sau khi thay đổi trường thả xuống.

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

Chỉ cần cập nhật dòng 6 và 7 như mong muốn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.