Добавление произвольных полей при выборе определенных шаблонов
Я пытаюсь внести изменения на сайт, текущая инфраструктура которого не идеальна из-за того, что он строился поверх старого сайта, а не с нуля.
У меня есть раздел сайта, которому нужны свои собственные произвольные поля. Этот раздел не оправдывает создание отдельного типа записи, и из-за текущего состояния сайта это крайне непрактично. Я не хочу заставлять пользователей работать с произвольными полями напрямую, так как это выглядит неаккуратно.
Вопрос: как я могу добавить поля (как для пользовательского типа записи) при выборе определенного шаблона страницы?

Вы можете это сделать? Конечно! Вам просто нужно запросить значение мета-ключа _wp_page_template
объекта $post
и действовать соответственно. Например, вот так:
// Глобализируем $post
global $post;
// Получаем мета-данные шаблона страницы
$page_template = get_post_meta( $post->ID, '_wp_page_template', true );
// Если текущая страница использует наш конкретный
// шаблон, то выводим наши мета-данные
if ( 'template-foobar.php' == $page_template ) {
// Здесь разместите ваш специфический код для пользовательских мета-данных
}
Теперь я бы порекомендовал использовать пользовательские метабоксы вместо пользовательских полей.
Хотя полная реализация пользовательских метабоксов немного выходит за рамки вашего вопроса, основной ответ остается тем же. Я постараюсь направить вас в правильном направлении. Вам нужно будет использовать комбинацию add_meta_box()
, вызываемую в колбэке, привязанном к add_meta_boxes-{hook}
, колбэка для определения метабокса и колбэка для валидации/санитизации и сохранения пользовательских мета-данных.
function wpse70958_add_meta_boxes( $post ) {
// Получаем мета-данные шаблона страницы
$page_template = get_post_meta( $post->ID, '_wp_page_template', true );
// Если текущая страница использует наш конкретный
// шаблон, то добавляем наш пользовательский метабокс
if ( 'template-foobar.php' == $page_template ) {
add_meta_box(
'wpse70958-custom-metabox', // HTML ID атрибут метабокса
'Специальные мета-данные', // Заголовок метабокса
'wpse70598_page_template_metabox', // имя колбэка
'page', // тип записи
'side', // контекст (advanced, normal или side)
'default', // приоритет (high, core, default или low)
);
}
}
// Убедитесь, что используете "_" вместо "-"
add_action( 'add_meta_boxes_page', 'wpse70958_add_meta_boxes' );
function wpse70598_page_template_metabox() {
// Определите поля формы метабокса здесь
}
function wpse70958_save_custom_post_meta() {
// Проведите санитизацию/валидацию мета-данных перед вызовом update_post_meta()
}
add_action( 'publish_page', 'wpse70958_save_custom_post_meta' );
add_action( 'draft_page', 'wpse70958_save_custom_post_meta' );
add_action( 'future_page', 'wpse70958_save_custom_post_meta' );
Редактирование
Возможно, лучше обернуть весь вызов add_meta_box()
в условие.

Великолепно! Этот ответ превзошел все мои ожидания. Спасибо, вы легенда!

Сработало идеально... Я бы проголосовал за или выбрал как ответ, но я только что присоединился к этой части Stack Exchange, так что, надеюсь, моя благодарность здесь будет достаточной ;)
