Как реализовать произвольные поля без использования плагинов?

13 дек. 2015 г., 08:02:49
Просмотры: 24.9K
Голосов: 3

Я пытаюсь создать каталог участников, используя произвольный тип записи members. Я знаком с тем, как использовать плагин ACF, но есть ли способы связать произвольное поле с определенным произвольным типом записи, чтобы иметь простое поле ввода, например, для номера телефона и адреса?

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

Произвольные поля уже являются встроенной функцией. Вам просто нужно добавить поддержку этого при регистрации вашего пользовательского типа записи ;-)

Pieter Goosen Pieter Goosen
13 дек. 2015 г. 08:18:30

Спасибо, Pieter, но есть ли способ добавить код, чтобы нам не приходилось выбирать произвольное поле для каждого добавления новой записи? Сначала попробую код Carl'а, чтобы проверить, сработает ли это

Mac organo Mac organo
14 дек. 2015 г. 15:49:38
Все ответы на вопрос 2
2

Если вы не хотите использовать плагин, вы можете попробовать реализовать метабокс, который будет связан с этим пользовательским типом записи. Вот код, который я использую, если нужно добавить простое поле ввода для определенного типа записи. В примере ниже предполагается, что member_post_type — это объявленный вами тип записи:

function member_add_meta_box() {
// Этот код добавит метабокс для типа записи member_post_type
$screens = array( 'member_post_type' );

foreach ( $screens as $screen ) {

    add_meta_box(
        'member_sectionid',
        __( 'Детали участника', 'member_textdomain' ),
        'member_meta_box_callback',
        $screen
    );
 }
}
add_action( 'add_meta_boxes', 'member_add_meta_box' );

/**
 * Выводит содержимое метабокса.
 *
 * @param WP_Post $post Объект текущей записи/страницы.
 */
function member_meta_box_callback( $post ) {

// Добавляем nonce поле для последующей проверки
wp_nonce_field( 'member_save_meta_box_data', 'member_meta_box_nonce' );

/*
 * Используем get_post_meta() для получения существующего значения
 * из базы данных и используем его для формы.
 */
$value = get_post_meta( $post->ID, '_my_meta_value_key', true );

echo '<label for="member_new_field">';
_e( 'Номер телефона', 'member_textdomain' );
echo '</label> ';
echo '<input type="text" id="member_new_field" name="member_new_field" value="' . esc_attr( $value ) . '" size="25" />';
}

/**
 * При сохранении записи сохраняет наши пользовательские данные.
 *
 * @param int $post_id ID сохраняемой записи.
 */
 function member_save_meta_box_data( $post_id ) {

 if ( ! isset( $_POST['member_meta_box_nonce'] ) ) {
    return;
 }

 if ( ! wp_verify_nonce( $_POST['member_meta_box_nonce'], 'member_save_meta_box_data' ) ) {
    return;
 }

 if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
    return;
 }

 // Проверяем права пользователя.
 if ( isset( $_POST['post_type'] ) && 'page' == $_POST['post_type'] ) {

    if ( ! current_user_can( 'edit_page', $post_id ) ) {
        return;
    }

 } else {

    if ( ! current_user_can( 'edit_post', $post_id ) ) {
        return;
    }
 }

 if ( ! isset( $_POST['member_new_field'] ) ) {
    return;
 }

 $my_data = sanitize_text_field( $_POST['member_new_field'] );

 update_post_meta( $post_id, '_my_meta_value_key', $my_data );
}
add_action( 'save_post', 'member_save_meta_box_data' );

Дополнительные ресурсы по метабоксам WordPress:

ознакомьтесь с документацией здесь

14 дек. 2015 г. 15:36:52
Комментарии

Я попробовал добавить ваш код в function.php моей темы, и у меня появился новый метабокс в моем пользовательском типе записей. Не подскажете, могу ли я также управлять порядком метабоксов, чтобы он отображался первым или последним?

Mac organo Mac organo
14 дек. 2015 г. 15:56:17

@Macorgano Да, это возможно. Пятый параметр функции add_meta_box определяет позицию метабокса, а шестой параметр задает приоритет.

Вам действительно стоит ознакомиться с документацией.

Ezra Obiwale Ezra Obiwale
5 июн. 2019 г. 09:07:09
0

Как я уже упоминал в комментариях,

Произвольные поля уже являются встроенной функциональностью. Вам просто нужно добавить поддержку этого при регистрации вашего пользовательского типа записи ;-)

У вас есть два варианта:

  • Когда вы регистрируете свой пользовательский тип записи, просто добавьте custom-fields в параметр supports

    Пример:

    add_action( 'init', 'codex_custom_init' );
    function codex_custom_init() {
        $args = [
          'public' => true,
          'label'  => 'Книги',
          'supports' => ['title', 'editor', 'author', 'thumbnail', 'excerpt', 'custom-fields']
        ];
        register_post_type( 'book', $args );
    }
    
  • Вы можете просто использовать add_post_type_support() для добавления произвольных полей к вашему пользовательскому типу записи

    Пример:

    add_action( 'init', 'wpcodex_add_custom_fileds_support_for_cpt', 11 );
    function wpcodex_add_custom_fileds_support_for_cpt() {
        add_post_type_support( 'cpt', 'custom-fields' ); // Замените cpt на ваш тип записи
    }
    
14 дек. 2015 г. 21:15:54