Как добавить дополнительный атрибут в секцию 'Атрибуты страницы' в wp-admin для страниц?

8 мар. 2012 г., 23:17:36
Просмотры: 26.2K
Голосов: 14

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

Кто-нибудь знает, возможно ли это?

Или хотя бы добавить пользовательский блок под этим блоком?

0
Все ответы на вопрос 2
3
18

Нет удобных хуков для добавления чего-либо в этот блок.

Вы можете сделать одно из двух.

1. Добавить новую метабокс

Это можно сделать, подключившись к действию add_meta_boxes и вызвав функцию add_meta_box. Вы можете указать функцию обратного вызова при вызове add_meta_box. Эта функция будет отвечать за вывод вашего выпадающего списка.

<?php
add_action( 'add_meta_boxes', 'wpse44966_add_meta_box' );
/**
 * Добавляет метабокс на страницу редактирования
 */
function wpse44966_add_meta_box()
{
    add_meta_box(
        'wpse44966-meta-box', // id, используется как атрибут html id
        __( 'WPSE 44966 Meta Box' ), // заголовок метабокса, например "Атрибуты страницы"
        'wpse44966_meta_box_cb', // функция обратного вызова, которая выводит содержимое
        'page', // тип записи или страницы. Добавим только для страниц
        'side', // контекст (где на экране)
        'low' // приоритет, где должен располагаться в контексте?
    );
}

/**
 * Функция обратного вызова для нашего метабокса. Выводит содержимое
 */
function wpse44966_meta_box_cb( $post )
{
    // создайте ваш выпадающий список здесь
}

2. Удалить стандартный метабокс "Атрибуты страницы" и добавить свою версию

Весь контент на экране редактирования записи, за исключением основного редактора и области заголовка, является метабоксом. Вы можете удалить их с помощью функции remove_meta_box, а затем заменить своими.

Итак, сначала измените функцию добавления, чтобы включить вызов remove_meta_box. Затем вам нужно скопировать тело функции page_attributes_meta_box из wp-admin/includes/meta-boxes.php и поместить ваш код ниже.

<?php
add_action( 'add_meta_boxes', 'wpse44966_add_meta_box' );
/**
 * Добавляет метабокс на страницу редактирования
 */
function wpse44966_add_meta_box( $post_type )
{
    // удаляем стандартный
    remove_meta_box(
        'pageparentdiv',
        'page',
        'side'
    );

    // добавляем свой
    add_meta_box(
        'wpse44966-meta-box',
        'page' == $post_type ? __('Атрибуты страницы') : __('Атрибуты'),
        'wpse44966_meta_box_cb', 
        'page', 
        'side', 
        'low'
    );
}

/**
 * Функция обратного вызова для нашего метабокса. Выводит содержимое
 */
function wpse44966_meta_box_cb( $post )
{
    // Скопируйте содержимое функции `page_attributes_meta_box` сюда
    // добавьте ваш выпадающий список
}

В любом случае вам нужно подключиться к save_post, чтобы сохранить значение вашего поля с помощью add_post_meta и/или update_post_meta.

<?php
add_action( 'save_post', 'wpse44966_save_post' );
/**
 * Сохраняет значение нашего пользовательского поля
 */
function wpse44966_save_post( $post_id )
{
    // проверьте nonce, права доступа здесь
    // сохраните данные с помощью update_post_meta
}

Это руководство может вам помочь.

8 мар. 2012 г. 23:43:40
Комментарии

Спасибо за отличный ответ. Я надеялся на какой-нибудь хук, но этот вариант тоже прекрасно подойдет :)

Steven Steven
8 мар. 2012 г. 23:53:46

прекрасное решение и полный ответ - ссылка заполняет пробелы - спасибо

Q Studio Q Studio
5 дек. 2012 г. 15:08:26

Начиная с WordPress 4.9 существует хук действия page_attributes_misc_attributes, который срабатывает сразу после поля "Order" и перед пояснительным текстом внизу этого метабокса, позволяя расширить метабокс вместо необходимости его полной замены. В качестве аргумента он передает $post - объект текущей записи.

Andy Macaulay-Brook Andy Macaulay-Brook
12 июл. 2018 г. 13:42:59
2

Ура! Начиная с версии WP 4.9.0, появился хук для добавления кода в метабокс "Атрибуты страницы": 'page_attributes_misc_attributes'. Подробности смотрите в Кодексе.

Пример:

function wpse44966_page_attributes( $post ) {

    wp_nonce_field( 'wpse44966_page_attributes_nonce', 'wpse44966_page_attributes_nonce' );
    ?>
    <p class="post-attributes-label-wrapper wpse44966-label-wrapper">
        <label class="wpse44966-label" for="wpse44966_option" style="font-weight: 600;"><?php _e( 'Метка опции', 'textdomain' ); ?></label>
        <input id="wpse44966_option" name="wpse44966_option" type="checkbox" value="1" style="margin-left: 5px;"<?php if( isset( $post->wpse44966_option ) && $post->wpse44966_option ) echo ' checked="checked"'; ?>>
    </p>
    <?php
}
add_action( 'page_attributes_misc_attributes', 'wpse44966_page_attributes' );

function wpse44966_metabox_save_post( $post_id ) {
    if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
    if( ! isset( $_POST['wpse44966_page_attributes_nonce'] ) || ! wp_verify_nonce( $_POST['wpse44966_page_attributes_nonce'], 'wpse44966_page_attributes_nonce' ) ) return;
    if( ! current_user_can( 'edit_post', $post_id ) ) return;
    $wpse44966_option = (int) ( isset( $_POST['wpse44966_option'] ) && $_POST['wpse44966_option'] );
    update_post_meta( $post_id, 'wpse44966_option', $wpse44966_option );
}
add_action( 'save_post', 'wpse44966_metabox_save_post' );
10 окт. 2020 г. 23:10:09
Комментарии

Ссылка перемещена на https://developer.wordpress.org/reference/functions/page_attributes_meta_box/

Pea Pea
23 окт. 2021 г. 05:17:45

Важное замечание: Если вы каким-то образом используете ID записи при сохранении значения, сначала убедитесь, что это не ревизия. Я использовал это для сохранения настройки сайта на основе ID записи, но иногда сохранялся ID ревизии, что приводило к проблемам. Чтобы этого избежать, добавьте if( ! wp_is_post_revision( $post_id ) return;

Jeremy Carlson Jeremy Carlson
3 сент. 2024 г. 20:01:42