Как добавить дополнительный атрибут в секцию 'Атрибуты страницы' в wp-admin для страниц?
Я хотел бы добавить выпадающий список в блок Атрибуты страницы
, который отображается в правой части административного интерфейса для страниц.
Кто-нибудь знает, возможно ли это?
Или хотя бы добавить пользовательский блок под этим блоком?

Нет удобных хуков для добавления чего-либо в этот блок.
Вы можете сделать одно из двух.
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
}
Это руководство может вам помочь.

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

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

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

Ура! Начиная с версии 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' );

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

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