Вопрос или проблема
Ок, я зарегистрировал несколько пользовательских типов записей и таксономий. Теперь, черт возьми, я не могу понять, какой код мне нужно добавить, чтобы добавить пользовательское поле к моему пользовательскому типу записи.
Мне нужно выпадающее меню и однострочное текстовое поле. Но мне также нужно иметь отдельные поля для типов записей. Так что, скажем, первый тип записи имеет 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.
По сути, вам нужно два шага, чтобы добавить пользовательское поле к пользовательскому типу записи:
- Создайте метабокс, который содержит ваше пользовательское поле
- Сохраните ваше пользовательское поле в базе данных
Эти шаги глобально описаны здесь: 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');
Примечания
-
Зависимость от типа записи: Если у вас есть разные типы записей с разными полями, вам просто нужно дублировать код для каждого типа записи, изменив название функции и соответствующий хук. Например:
add_action('add_meta_boxes_custom_post_type_2', 'custom_post_type_2_metaboxes');
-
Безопасность: Всегда проверяйте права доступа пользователя перед сохранением данных, чтобы не допустить несанкционированных изменений.
-
Использование плагинов: Если вы не хотите углубляться в код, можете рассмотреть использование плагинов, таких как Advanced Custom Fields (ACF) или Meta Box, которые предоставляют удобные интерфейсы для создания пользовательских полей без необходимости ручного программирования.
Заключение
Добавление пользовательских полей к пользовательским типам записей в WordPress не так сложно, как может показаться на первый взгляд. С помощью указанных выше шагов вы сможете создать мощные и специализированные интерфейсы для управления данными вашего контента. Использование собственных полей значительно расширяет функциональность вашей страницы, позволяя легко управлять разнообразными данными.