Добавление произвольных полей при выборе определенных шаблонов

30 окт. 2012 г., 15:06:20
Просмотры: 14.1K
Голосов: 4

Я пытаюсь внести изменения на сайт, текущая инфраструктура которого не идеальна из-за того, что он строился поверх старого сайта, а не с нуля.

У меня есть раздел сайта, которому нужны свои собственные произвольные поля. Этот раздел не оправдывает создание отдельного типа записи, и из-за текущего состояния сайта это крайне непрактично. Я не хочу заставлять пользователей работать с произвольными полями напрямую, так как это выглядит неаккуратно.

Вопрос: как я могу добавить поля (как для пользовательского типа записи) при выборе определенного шаблона страницы?

2
Комментарии

Даже отправная точка была бы хороша, если кто-то знает хук или где можно найти текущий выбор шаблона в переменной на странице редактирования записи.

Leonard Leonard
30 окт. 2012 г. 15:11:20

Прошло 3 года с момента этого вопроса, но я хотел добавить, что теперь Advanced Custom Fields позволяет использовать поля условно для конкретных шаблонов. Так что нет необходимости обрабатывать это самостоятельно в коде.

Santiago Bendavid Santiago Bendavid
28 янв. 2016 г. 21:30:32
Все ответы на вопрос 1
4
13

Вы можете это сделать? Конечно! Вам просто нужно запросить значение мета-ключа _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() в условие.

30 окт. 2012 г. 15:32:22
Комментарии

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

Leonard Leonard
30 окт. 2012 г. 15:39:25

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

Leonard Leonard
30 окт. 2012 г. 17:55:52

Рад помочь, добро пожаловать в WPSE!

Chip Bennett Chip Bennett
31 окт. 2012 г. 03:18:33

Нормальный приоритет не является приоритетным и приведет к тому, что метабокс не отобразится. По умолчанию следует использовать приоритет "default". В остальном все верно! Спасибо

Joel Worsham Joel Worsham
7 нояб. 2014 г. 16:47:09