Добавление поля ввода на страницу 'Страницы > Редактировать страницу' через functions.php

1 июл. 2013 г., 15:22:06
Просмотры: 14.2K
Голосов: 2

Исходный вопрос:

Я пытаюсь добавить поле ввода на страницу 'Страницы > Редактировать страницу'. Это поле будет использоваться для ввода 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) . '"]'); ?>
5
Комментарии

Почему бы не использовать плагин для этого (особенно если вы не программист)? Advanced Custom Fields отлично справится с этой задачей.

Krzysiek Dróżdż Krzysiek Dróżdż
1 июл. 2013 г. 15:23:53

Огромное спасибо за ответ (и такой быстрый!).

Я действительно не хочу использовать плагин, мне бы хотелось, чтобы функционал был прямо в Дочерней Теме. Весь смысл в том, чтобы эта Дочерняя Тема не требовала специальных плагинов и её можно было легко редактировать.

Я полностью готов делать всё сложным путём, для меня результат того стоит :)

Paxjah Paxjah
1 июл. 2013 г. 15:34:57

@user771764 Если вы хотите сохранять ID слайдера для конкретных страниц для всех страниц, то вам следует использовать метабоксы записей http://codex.wordpress.org/Function_Reference/add_meta_box вместо wp options.

Vinod Dalvi Vinod Dalvi
1 июл. 2013 г. 15:41:34

@Vinod Davli - Огромное спасибо за совет! Я уже начал это делать, но у меня возник вопрос - как получить значение? Для wp option я использовал 'get_option', но что использовать для meta? Еще раз спасибо :)

Paxjah Paxjah
1 июл. 2013 г. 15:48:01

Используйте get_post_meta (http://codex.wordpress.org/Function_Reference/get_post_meta).

Krzysiek Dróżdż Krzysiek Dróżdż
1 июл. 2013 г. 15:54:37
Все ответы на вопрос 3
0

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) . '"]'); ?>
4 июл. 2013 г. 18:25:47
4

Прежде всего, следует использовать произвольные поля, если вы хотите присвоить дополнительные значения конкретным записям/страницам, а не всему сайту глобально.

Затем необходимо использовать функцию 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 символов)

1 июл. 2013 г. 15:54:04
Комментарии

Используйте 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 Vinod Dalvi
1 июл. 2013 г. 16:18:35

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

Krzysiek Dróżdż Krzysiek Dróżdż
1 июл. 2013 г. 16:24:13

@Vinod Dalvi и Krzysiek Dróżdż - Спасибо вам обоим! Теперь слайдер работает и вызывается из шаблона, но он вызывает первый созданный слайдер на каждой странице и также не сохраняет значение каждого слайдера в текстовом поле ввода.

Paxjah Paxjah
1 июл. 2013 г. 16:33:47

Я обновил свой исходный пост и был бы очень признателен за любые дополнительные советы, которые вы можете дать :)

Paxjah Paxjah
1 июл. 2013 г. 18:31:25
1

Если вам нужно сохранить ID слайдера для конкретной страницы (для всех страниц), следует использовать метабоксы записей вместо wp options.

Для получения значения из метаполя используйте функцию get_post_meta() вместо функции get_option().

1 июл. 2013 г. 16:15:14
Комментарии

Я отредактировал свой исходный пост, теперь вопрос решён, спасибо всем :)

Paxjah Paxjah
1 июл. 2013 г. 18:46:02