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?
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?
Câu trả lời:
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);
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.