Создание пользовательского поля с выпадающим списком на странице создания записи

23 дек. 2012 г., 15:22:03
Просмотры: 14.4K
Голосов: 4

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

Я знаю, как добавить простое пользовательское поле, и уже добавил несколько таким образом:

add_action('wp_insert_post', 'set_default_custom_fields'); 
function set_default_custom_fields($post_id) {
if ( $_GET['post_type'] != 'page' ) {
add_post_meta($post_id, 'email', 'xyz@mail.com', true);
}
}

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

add_action('wp_insert_post', 'set_default_custom_fields'); 
function set_default_custom_fields($post_id) {
    if ( $_GET['post_type'] != 'page' ) {
<select name="voodoo_dropdown" id="voodoo_dropdown">
        <option<?php selected( add_post_meta($post->ID, 'voodoo_dropdown', true), 'USA' ); ?>>США</option>
        <option<?php selected( add_post_meta($post->ID, 'voodoo_dropdown', true), 'Canada' ); ?>>Канада</option>
        <option<?php selected( add_post_meta($post->ID, 'voodoo_dropdown', true), 'Mexico' ); ?>>Мексика</option>
        </select>
}
return ;
}

Из-за недостатка знаний я не уверен, где именно я ошибаюсь и что нужно сделать для решения этой задачи.

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

Каким именно образом это не работает?

s_ha_dum s_ha_dum
23 дек. 2012 г. 17:20:46

@s_ha_dum: выпадающий список не отображается

Umesh Awasthi Umesh Awasthi
23 дек. 2012 г. 20:01:13
Все ответы на вопрос 3
0

Вместо того чтобы определять значения по умолчанию для пользовательских полей, вам следует поступить так, как говорит Мило. В вашем файле functions.php должно быть что-то подобное. Я попытался следовать вашим требованиям, но не тестировал код.

<?php

// действие для добавления метабоксов
add_action( 'add_meta_boxes', 'voodoo_dropdown_metabox' );
// действие при сохранении записи
add_action( 'save_post', 'voodoo_dropdown_save' );

// функция, создающая новый метабокс, который будет отображаться в записи
function voodoo_dropdown_metabox() {
    add_meta_box( 
        'voodoo_dropdown',  // уникальный идентификатор
        __( 'Voodoo Dropdown', 'mytheme_textdomain' ),  // заголовок метабокса
        'voodoo_dropdown_display',  // функция для отображения выпадающего списка
        'post'   // тип записи
    );
}

// отображение выпадающего списка voodoo
function voodoo_dropdown_display( $post ) {

  // Используем nonce для проверки
  wp_nonce_field( basename( __FILE__ ), 'voodoo_dropdown_nonce' );

  // получаем текущее значение
  $dropdown_value = get_post_meta( get_the_ID(), 'voodoo_dropdown', true );
  ?>
    <select name="voodoo_dropdown" id="voodoo_dropdown">
        <option value="USA" <?php if($dropdown_value == 'USA') echo 'selected'; ?>>США</option>
        <option value="Canada" <?php if($dropdown_value == 'Canada') echo 'selected'; ?>>Канада</option>
        <option value="Mexico" <?php if($dropdown_value == 'Mexico') echo 'selected'; ?>>Мексика</option>
    </select>
  <?php
}

// сохранение выпадающего списка
function voodoo_dropdown_save( $post_id ) {

    // если это автосохранение, ничего не делаем
  if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) 
      return;

  // проверяем nonce
  if ( !wp_verify_nonce( $_POST['voodoo_dropdown_nonce'], basename( __FILE__ ) ) )
      return;


  // Проверяем права доступа
  if ( 'page' == $_POST['post_type'] ) 
  {
    if ( !current_user_can( 'edit_page', $post_id ) )
        return;
  }
  else
  {
    if ( !current_user_can( 'edit_post', $post_id ) )
        return;
  }

  // сохраняем новое значение выпадающего списка
  $new_value = $_POST['voodoo_dropdown'];
  update_post_meta( $post_id, 'voodoo_dropdown', $new_value );
}
?>

Если вам кажется, что это слишком сложно, вы можете использовать плагин для метабоксов – найдите в каталоге плагинов WordPress тот, который уже поддерживает выпадающие списки.

23 дек. 2012 г. 19:07:30
0

Добавьте выпадающий список на экран редактирования записи в метабоксе с помощью add_meta_box, затем в действии save_post вы можете проверить и сохранить выбранный вариант как метаданные записи.

23 дек. 2012 г. 18:28:20
0

Однажды я работал над похожей задачей, вот сырой код для этого, надеюсь, он поможет.

<?php
add_action( 'add_meta_boxes', 'yss_custom_post_cat_add' );
function yss_custom_post_cat_add() {
 add_meta_box( 'my-meta-box-id', 'Моя пользовательская категория записи', 'yss_custom_post_cat', 'post', 'normal', 'high' );
}

function yss_custom_post_cat( $post ) {
 $values = get_post_custom( $post->ID );
 $selected = isset( $values['custom_post_cat_select'] ) ? esc_attr( $values['custom_post_cat_select'][0] ) : '';
 wp_nonce_field( 'my_meta_box_nonce', 'meta_box_nonce' );
?>

   <p>
    <label for="custom_post_cat_select">Выберите вашу пользовательскую категорию записи</label>
    <br>
    <select name="custom_post_cat_select" id="custom_post_cat_select">
     <option value="picture" <?php selected( $selected, 'none' ); ?>>(ничего)</option>
     <option value="picture" <?php selected( $selected, 'picture' ); ?>>Изображение</option>
     <option value="video" <?php selected( $selected, 'video' ); ?>>Видео</option>
     <option value="sports" <?php selected( $selected, 'sports' ); ?>>Спорт</option>
     <option value="guesswho" <?php selected( $selected, 'guesswho' ); ?>>Угадай кто</option>
     <option value="decisionpoll" <?php selected( $selected, 'decisionpoll' ); ?>>Опрос для решения</option>
     <option value="audio" <?php selected( $selected, 'audio' ); ?>>Аудио</option>
    </select>
   </p>
<?php
}

add_action( 'save_post', 'yss_custom_post_cat_save' );
function yss_custom_post_cat_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' ) ) return;
 // теперь мы можем сохранить данные
 $allowed = array(
            'a' => array( // разрешаем только теги a
            'href' => array() // и эти якоря могут иметь только атрибут href
    )
 );

// Хорошая идея убедиться, что ваши данные установлены
 if( isset( $_POST['custom_post_cat_select'] ) )
  update_post_meta( $post_id, 'custom_post_cat_select', esc_attr( $_POST['custom_post_cat_select'] ) );
}
?>
16 сент. 2013 г. 12:09:53