Добавление поля ввода на страницу 'Страницы > Редактировать страницу' через functions.php
Исходный вопрос:
Я пытаюсь добавить поле ввода на страницу 'Страницы > Редактировать страницу'. Это поле будет использоваться для ввода ID слайдера, чтобы слайдер был привязан к конкретной странице.
Пример:
- Пользователь добавляет ID слайдера в поле ввода на экране редактирования страницы.
- Страница использует этот ID для отображения слайдера.
Спасибо всем, кто ответил, вы замечательное сообщество! Я получил отличную помощь на этом сайте, спасибо!
ФИНАЛЬНЫЙ РЕЗУЛЬТАТ
functions.php
// Добавляем пользовательское поле для ID слайдера на страницу редактирования
add_action( 'add_meta_boxes', 'cd_meta_box_add' );
function cd_meta_box_add() {
add_meta_box( 'my-meta-box-id', 'Слайдер', 'cd_meta_box_cb', 'page', 'normal', 'high' );
}
function cd_meta_box_cb( $post ) {
$values = get_post_custom( $post->ID );
$text = isset( $values['my_meta_box_text'] ) ? esc_attr( $values['my_meta_box_text'][0] ) : '';
wp_nonce_field( 'my_meta_box_nonce', 'meta_box_nonce' );
?>
<p>
<label for="my_meta_box_text">Добавьте ID слайдера</label>
<input type="text" name="my_meta_box_text" id="my_meta_box_text" value="<?php echo $text; ?>" />
</p>
<?php
}
add_action( 'save_post', 'cd_meta_box_save' );
function cd_meta_box_save( $post_id ) {
// Выходим, если это автосохранение
if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
// Если nonce отсутствует или не может быть проверен, выходим
if( !isset( $_POST['meta_box_nonce'] ) || !wp_verify_nonce( $_POST['meta_box_nonce'], 'my_meta_box_nonce' ) ) return;
// Если текущий пользователь не может редактировать запись, выходим
if( !current_user_can( 'edit_post', $post_id ) ) return;
// Теперь можно сохранить данные
$allowed = array(
'a' => array( // разрешаем только теги 'a'
'href' => array() // и только с атрибутом href
)
);
// Проверяем, установлены ли данные
if( isset( $_POST['my_meta_box_text'] ) )
update_post_meta( $post_id, 'my_meta_box_text', wp_kses( $_POST['my_meta_box_text'], $allowed ) );
}
Page.php
<?php echo do_shortcode( '[cycloneslider id="' . get_post_meta(get_the_ID(), 'my_meta_box_text', true) . '"]'); ?>
functions.php
// Добавляем пользовательское поле для ID слайдера в 'Редактирование страницы'
add_action( 'add_meta_boxes', 'cd_meta_box_add' );
function cd_meta_box_add() {
add_meta_box( 'my-meta-box-id', 'Слайдер', 'cd_meta_box_cb', 'page', 'normal', 'high' );
}
function cd_meta_box_cb( $post ) {
$values = get_post_custom( $post->ID );
$text = isset( $values['my_meta_box_text'] ) ? esc_attr( $values['my_meta_box_text'][0] ) : '';
wp_nonce_field( 'my_meta_box_nonce', 'meta_box_nonce' );
?>
<p>
<label for="my_meta_box_text">Добавьте ID слайдера</label>
<input type="text" name="my_meta_box_text" id="my_meta_box_text" value="<?php echo $text; ?>" />
</p>
<?php
}
add_action( 'save_post', 'cd_meta_box_save' );
function cd_meta_box_save( $post_id ) {
// Выходим, если это автосохранение
if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
// Если nonce отсутствует или не может быть проверен, выходим
if( !isset( $_POST['meta_box_nonce'] ) || !wp_verify_nonce( $_POST['meta_box_nonce'], 'my_meta_box_nonce' ) ) return;
// Если текущий пользователь не может редактировать запись, выходим
if( !current_user_can( 'edit_post', $post_id ) ) return;
// Теперь можно сохранять данные
$allowed = array(
'a' => array( // разрешаем только теги a
'href' => array() // и только с атрибутом href
)
);
// Проверяем, установлены ли данные
if( isset( $_POST['my_meta_box_text'] ) )
update_post_meta( $post_id, 'my_meta_box_text', wp_kses( $_POST['my_meta_box_text'], $allowed ) );
}
Page.php
<?php echo do_shortcode( '[cycloneslider id="' . get_post_meta(get_the_ID(), 'my_meta_box_text', true) . '"]'); ?>
Прежде всего, следует использовать произвольные поля, если вы хотите присвоить дополнительные значения конкретным записям/страницам, а не всему сайту глобально.
Затем необходимо использовать функцию add_meta_box для регистрации вашего пользовательского метабокса, который позволит легко редактировать эти произвольные поля.
Вот пример кода:
// регистрируем ваш пользовательский метабокс
function my_slider_properties_meta_box() {
add_meta_box('my_slider_properties', 'Название формата ссылки URL', 'my_slider_properties', 'page', 'side', 'default');
}
add_action('add_meta_boxes', 'my_slider_properties_meta_box');
// выводим ваш пользовательский метабокс
function my_slider_properties() {
global $post;
$my_slider_id = get_post_meta($post->ID, '_my_slider_id', true);
echo '<p>ID моего слайдера</p>';
echo '<input type="text" name="_my_slider_id" value="' . esc_attr($my_slider_id) . '" size="40" />';
}
// обрабатываем ваш пользовательский метабокс при сохранении
function my_slider_properties_save_meta($post_id, $post) {
if ( !current_user_can( 'edit_post', $post->ID ))
return $post->ID;
$metas['_my_slider_id'] = $_POST['_my_slider_id'];
foreach ($metas as $key => $value) {
update_post_meta($post->ID, $key, $value);
}
}
add_action('save_post', 'my_slider_properties', 1, 2);
Это только базовый пример того, как это можно сделать. Вам следует позаботиться о безопасности (использовать nonce) и других аспектах. Но основная идея должна быть понятна.
(6 символов)
Используйте add_meta_box('my_slider_properties', 'Формат ссылки Заголовок URL', 'my_slider_properties', 'page', 'side', 'default'); вместо add_meta_box('my_slider_properties', 'Формат ссылки Заголовок URL', 'my_slider_properties', 'post', 'side', 'default'); потому что пользователь хочет использовать метаданные записей на страницах, а не в постах.
Vinod Dalvi
Спасибо, я упустил это из виду. Ты прав, он хотел добавить это на страницы, а не в записи :) Я исправил свой код, теперь всё должно работать правильно.
Krzysiek Dróżdż
@Vinod Dalvi и Krzysiek Dróżdż - Спасибо вам обоим! Теперь слайдер работает и вызывается из шаблона, но он вызывает первый созданный слайдер на каждой странице и также не сохраняет значение каждого слайдера в текстовом поле ввода.
Paxjah
Если вам нужно сохранить ID слайдера для конкретной страницы (для всех страниц), следует использовать метабоксы записей вместо wp options.
Для получения значения из метаполя используйте функцию get_post_meta() вместо функции get_option().