Как добавить пользовательские поля к пользовательскому типу записи?

Вопрос или проблема

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

Мне нужно выпадающее меню и однострочное текстовое поле. Но мне также нужно иметь отдельные поля для типов записей. Так что, скажем, первый тип записи имеет 3 поля, а второй тип записи имеет 4 поля, но они разные.

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

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

Если вы хотите написать свой собственный, вот несколько достойных учебников:

Добавьте/измените аргумент supports (используя register_post_type), чтобы включить custom-fields на экране редактирования записей вашего пользовательского типа:

'supports' => array( 
  'title', 
  'editor', 
  'excerpt', 
  'thumbnail', 
  'custom-fields', 
  'revisions' 
)

Источник: https://developer.wordpress.org/reference/functions/register_post_type/#supports

Хотя вам нужно будет добавить некоторую валидацию, это действие не кажется сложным для текущей версии WordPress.

По сути, вам нужно два шага, чтобы добавить пользовательское поле к пользовательскому типу записи:

  1. Создайте метабокс, который содержит ваше пользовательское поле
  2. Сохраните ваше пользовательское поле в базе данных

Эти шаги глобально описаны здесь: http://wordpress.org/support/topic/is-it-possible-to-add-an-extra-field-to-a-custom-post-type

Пример:

Добавьте пользовательское поле с названием “function” к пользовательскому типу записи с названием “prefix-teammembers”.

Сначала добавьте метабокс:

function prefix_teammembers_metaboxes( ) {
   global $wp_meta_boxes;
   add_meta_box('postfunctiondiv', __('Function'), 'prefix_teammembers_metaboxes_html', 'prefix_teammembers', 'normal', 'high');
}
add_action( 'add_meta_boxes_prefix-teammembers', 'prefix_teammembers_metaboxes' );

Если вы добавляете или редактируете “prefix-teammembers”, то срабатывает хук add_meta_boxes_{custom_post_type}. См. http://codex.wordpress.org/Function_Reference/add_meta_box для функции add_meta_box(). В приведенном выше вызове add_meta_box() есть prefix_teammembers_metaboxes_html, обратный вызов для добавления вашего поля формы:

function prefix_teammembers_metaboxes_html()
{
    global $post;
    $custom = get_post_custom($post->ID);
    $function = isset($custom["function"][0])?$custom["function"][0]:'';
?>
    <label>Функция:</label><input name="function" value="<?php echo $function; ?>">
<?php
}

На втором шаге вы сохраняете ваше пользовательское поле в базу данных. При сохранении срабатывает хук save_post_{custom_post_type} (с версии 3.7, см.: https://stackoverflow.com/questions/5151409/wordpress-save-post-action-for-custom-posts). Вы можете подключить это для сохранения вашего пользовательского поля:

function prefix_teammembers_save_post()
{
    if(empty($_POST)) return; //почему срабатывает prefix_teammembers_save_post при добавлении нового? 
    global $post;
    update_post_meta($post->ID, "function", $_POST["function"]);
}   

add_action( 'save_post_prefix-teammembers', 'prefix_teammembers_save_post' );   

Ссылка на thinkvitamin.com в принятом ответе больше не работает. Этот сайт сменил домен на treehouse.com. Я отвечаю здесь только потому, что у меня недостаточно репутации, чтобы комментировать. Содержимое этой недействительной ссылки доступно здесь: https://blog.teamtreehouse.com/create-your-first-wordpress-custom-post-type для всех, кто нуждается в этом. Удачи!

Существуют различные плагины для пользовательских метабоксов и пользовательских полей. Если вы ищете плагин, ориентированный на разработчиков, вам стоит попробовать Meta Box. Он легковесен и очень мощен.

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

Я знаю, что этот вопрос старый, но для получения дополнительной информации по теме

WordPress имеет встроенную поддержку пользовательских полей. Если у вас есть пользовательский тип записи, то все, что вам нужно сделать, это включить ‘custom-fields’ в массив поддержки внутри register_post_type, как и ответил @kubante

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

Теперь это пользовательское поле очень простое и принимает строку в качестве значения. Во многих случаях этого достаточно, но для более сложных полей я советую использовать плагин ‘Advanced Custom Fields’.

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

Щелкните 3 вертикальные точки в верхнем левом углу > настройки > Панели

введите описание изображения здесь

Конечно, это после того, как вы убедитесь, что у типа записи правильная конфигурация.

function custom_field(){ // пользовательские поля для пользовательского типа записи stackoverflow
add_meta_box(
‘custom_field’,
‘пользовательское поле’,
‘custom_field_type’,
‘user’,
‘normal’,
‘low’

     );
 }
 add_action('add_meta_boxes','custom_field');
 
 function custom_field_type($post){
     $state = get_post_meta($post->ID,'state',true);
     $country = get_post_meta($post->ID,'country',true);
     $pincode = get_post_meta($post->ID,'pincode',true);
     $college = get_post_meta($post->ID,'college',true);
     ?>
     <label for = "state"> Штат : </label>
     <input type ="text" name="state" value="<?php echo $state ?>"><br><br>
     <label for = "country"> Страна : </label>
     <input type ="text" name="country" value="<?php echo $country ?>"><br><br>
     <label for = "pincode"> Индекс : </label>
     <input type ="text" name="pincode" value="<?php echo $pincode?>"><br><br>
     <label for = "college"> Название колледжа : </label>
     <input type ="text" name="college" value="<?php echo $college ?>"><br><br>
     <?php
 }

 function handle_custom_field($post_id){
     if(isset($_POST['state'])){
         $state = $_POST['state'];
         update_post_meta($post_id, 'state', $state);
     }
     if(isset($_POST['country'])){
         $country = $_POST['country'];
         update_post_meta($post_id,'country', $country);
     }
     if(isset($_POST['pincode'])){
         $pincode = $_POST['pincode'];
         update_post_meta($post_id,'pincode',$pincode);
     }
     if(isset($_POST['college'])){
        $college = $_POST['college'];
        update_post_meta($post_id,'college',$college);
    }
 }
 add_action('save_post','handle_custom_field');

// slider_metaboxes_html , функция для создания HTML 
function slider_metaboxes( ) {
   global $wp_meta_boxes;
   add_meta_box('postfunctiondiv', __('Пользовательская ссылка'), 'slider_metaboxes_html', 'slider', 'normal', 'high');
}

//add_meta_boxes_slider => add_meta_boxes_{пользовательский тип записи}
add_action( 'add_meta_boxes_slider', 'slider_metaboxes' );

Отличное знание

Ответ или решение

Чтобы добавить пользовательские поля к пользовательским типам записей в WordPress, вам необходимо выполнить несколько шагов. Мы рассмотрим создание метаполей с помощью функции add_meta_box, их сохранение и вывод на экран. Также будут рассмотрены варианты для разных типов записей, чтобы обеспечить гибкость в использовании.

Шаг 1: Добавление метабокса

При помощи функции add_meta_box вы можете создать метабокс, который будет отображаться при редактировании вашего пользовательского типа записи. В этом метабоксе будут находиться ваши пользовательские поля.

Пример:

function prefix_teammembers_metaboxes() {
    add_meta_box(
        'teammember_function',
        __('Функция'),
        'prefix_teammembers_metaboxes_html',
        'prefix_teammembers', // Укажите ваш пользовательский тип записи
        'normal',
        'high'
    );
}
add_action('add_meta_boxes_prefix-teammembers', 'prefix_teammembers_metaboxes');

Шаг 2: Вывод полей в метабоксе

Теперь вам нужно создать функцию для вывода HTML-кода ваших пользовательских полей. Например, если вы хотите добавить выпадающий список и однострочное текстовое поле, это будет выглядеть так:

function prefix_teammembers_metaboxes_html($post) {
    // Получаем текущие значения
    $custom = get_post_custom($post->ID);
    $function = isset($custom["function"][0]) ? $custom["function"][0] : '';
    $dropdown_value = isset($custom["dropdown_field"][0]) ? $custom["dropdown_field"][0] : '';

    ?>
    <label for="function">Функция:</label>
    <input type="text" name="function" value="<?php echo esc_attr($function); ?>"><br><br>

    <label for="dropdown_field">Выберите значение:</label>
    <select name="dropdown_field">
        <option value="option1" <?php selected($dropdown_value, 'option1'); ?>>Опция 1</option>
        <option value="option2" <?php selected($dropdown_value, 'option2'); ?>>Опция 2</option>
        <option value="option3" <?php selected($dropdown_value, 'option3'); ?>>Опция 3</option>
    </select>
    <?php
}

Шаг 3: Сохранение метаполей

Чтобы сохранить значения пользовательских полей при сохранении записи, мы используем хук save_post. Ваша функция будет обработкой данных и их записью в базу данных:

function prefix_teammembers_save_post($post_id) {
    // Проверка прав доступа
    if (!current_user_can('edit_post', $post_id)) {
        return;
    }

    // Сохранение пользовательского поля "функция"
    if (isset($_POST['function'])) {
        update_post_meta($post_id, "function", sanitize_text_field($_POST['function']));
    }

    // Сохранение пользовательского поля "выпадающий список"
    if (isset($_POST['dropdown_field'])) {
        update_post_meta($post_id, "dropdown_field", sanitize_text_field($_POST['dropdown_field']));
    }
}
add_action('save_post_prefix-teammembers', 'prefix_teammembers_save_post');

Примечания

  1. Зависимость от типа записи: Если у вас есть разные типы записей с разными полями, вам просто нужно дублировать код для каждого типа записи, изменив название функции и соответствующий хук. Например:

    add_action('add_meta_boxes_custom_post_type_2', 'custom_post_type_2_metaboxes');
  2. Безопасность: Всегда проверяйте права доступа пользователя перед сохранением данных, чтобы не допустить несанкционированных изменений.

  3. Использование плагинов: Если вы не хотите углубляться в код, можете рассмотреть использование плагинов, таких как Advanced Custom Fields (ACF) или Meta Box, которые предоставляют удобные интерфейсы для создания пользовательских полей без необходимости ручного программирования.

Заключение

Добавление пользовательских полей к пользовательским типам записей в WordPress не так сложно, как может показаться на первый взгляд. С помощью указанных выше шагов вы сможете создать мощные и специализированные интерфейсы для управления данными вашего контента. Использование собственных полей значительно расширяет функциональность вашей страницы, позволяя легко управлять разнообразными данными.

Оцените материал
Добавить комментарий

Капча загружается...