Вопрос или проблема
Я хочу автоматически добавлять значение пользовательского поля при публикации поста,
мое имя пользовательского поля – “quality”, а значение – “HD”.
Я просмотрел этот сайт, и, похоже, найденные коды не работают.
Пока я пробовал этот код:
/* Сделать что-то с введенными данными */
add_action( 'save_post', 'myplugin_save_postdata' );
function myplugin_save_postdata( $post_id ) {
if ( 'page' == $_POST['post_type'] ) {
if ( ! current_user_can( 'edit_page', $post_id ) )
return;
} else {
if ( ! current_user_can( 'edit_post', $post_id ) )
return;
}
$mydata="quality"; // Сделать что-то с $mydata
update_post_meta( $post_id, 'HD', $mydata );
}
и этот код
add_action('publish_page', 'add_custom_field_automatically');
add_action('publish_post', 'add_custom_field_automatically');
function add_custom_field_automatically($post_ID) {
global $wpdb;
if(!wp_is_post_revision($post_ID)) {
add_post_meta($post_ID, 'quality', 'HD', true);
}
}
Следовал инструкциям и поместил этот код выше в свой functions.php, и ничего не произошло. Пользовательские поля по-прежнему пусты, а я посмотрел пост на главной странице, и значения не добавлено.
Спасибо! Надеюсь, мой вопрос понятен.
Я думаю, что update_post_meta( $post_id, 'HD', $mydata );
имеет свои аргументы в неправильном порядке и должно быть update_post_meta( $post_id, 'quality', 'HD');
Или вы можете использовать “HD” в качестве значения по умолчанию, когда вам нужно пользовательское поле и оно не существует. Например:
global $post;
$theQuality = empty(get_post_meta( $post->ID, 'quality')) ? 'HD' : get_post_meta( $post->ID, 'quality', true);
Или, если вы не можете заставить это работать при сохранении, то попробуйте это в functions.php:
function my_add_default_cf() {
global $post;
if ( empty(get_post_meta( $post->ID, 'quality', true)) ) {
// (если необходимо) добавьте дополнительное условие, чтобы ограничить, какие посты/страницы проверяются
update_post_meta( $post->ID, 'quality', 'HD',true);
}
}
add_action( 'pre_get_posts', 'my_add_default_cf' );
Теоретически неэффективно, так как выполняется для каждого поста, но на практике минимальная обработка и незаметно.
Редактировать
Я убрал проверку на то, была ли публикация (get_post_status( $post->ID ) == 'publish'
) из приведенного выше кода (мое плохое предположение).
Проверено и работает для меня с WP 4.9.4. Если у поста/страницы еще нет пользовательского поля “quality” или у него нет значения, то оно добавляется как “HD” в следующих обстоятельствах:
сохранение черновика или при публикации; при открытии существующего поста/страницы для редактирования; предварительный просмотр (хотя он сделан, редакторская страница не покажет его до обновления); и когда посещается опубликованный пост без поля “quality” или с пустым значением.
Если вы не хотите, чтобы это применялось задним числом к ранее опубликованным постам, то измените if ( empty(get_post_meta( $post->ID, 'quality', true)) ) {
на
if (get_post_status( $post->ID ) == 'draft' && empty(get_post_meta( $post->ID, 'quality', true)) ) {
Дополнительное тестирование/диагностика (если необходимо, временно добавьте это в functions.php):
function my_custfield_test($post_id) {
global $post;
?>
<meta name="mypostid" content="<?php echo $post->ID; ?>" />
<meta name="mypoststatus" content="<?php echo get_post_status( $post->ID ); ?>" />
<meta name="myquality" content="<?php echo get_post_meta( $post->ID,'quality', true); ?>" />
<?php
}
add_action( 'wp_head', 'my_custfield_test' );
Затем просмотрите HTML-код активной или предварительной страницы и где-то в <head>
:
Ваш оригинальный код
Я не знаком с действием save_post
, возможно, $post_id
не установлен? Внутри вашей функции ‘myplugin_save_postdata’: Попробуйте добавить global $post;
как первую строку; и замените все вхождения $post_id
на $post->ID
.
Хорошо, вот рабочие фрагменты, которые я использую сейчас и проверил, что они работают
function mfields_set_default_object_terms( $post_id, $post ) {
if ( 'publish' === $post->post_status ) {
$defaults = array(
'post_tag' => array( 'taco', 'banana' ),
'monkey-faces' => array( 'see-no-evil' ),
);
$taxonomies = get_object_taxonomies( $post->post_type );
foreach ( (array) $taxonomies as $taxonomy ) {
$terms = wp_get_post_terms( $post_id, $taxonomy );
if ( empty( $terms ) && array_key_exists( $taxonomy, $defaults ) ) {
wp_set_object_terms( $post_id, $defaults[$taxonomy], $taxonomy );
}
}
}
}
add_action( 'save_post', 'mfields_set_default_object_terms', 100, 2 );
Ответ или решение
Если вам необходимо автоматически добавлять значение пользовательского поля при публикации поста в WordPress, вы можете воспользоваться хуками, которые предоставляет платформа. В вашем случае, вы хотите установить поле с именем "quality" и значением "HD" при публикации поста. Рассмотрим, как это можно реализовать.
Установка пользовательского поля при публикации поста
Сначала убедитесь, что у вас есть доступ к файлу functions.php
вашей темы. Это место, где вы будете добавлять код для реализации нужной функции.
Вот рабочий пример кода, который поможет вам автоматически добавлять пользовательское поле "quality" со значением "HD" при публикации поста:
add_action('save_post', 'add_quality_custom_field');
function add_quality_custom_field($post_id) {
// Проверяем, является ли это автосохранением
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
// Проверяем, если пользователь имеет право редактировать пост
if (!current_user_can('edit_post', $post_id)) {
return;
}
// Устанавливаем значение пользовательского поля, если оно еще не установлено
if (get_post_meta($post_id, 'quality', true) == '') {
update_post_meta($post_id, 'quality', 'HD');
}
}
Объяснение кода
-
add_action: Здесь мы используем хук
save_post
, который срабатывает при сохранении поста. -
Проверка автосохранения: Вызывается встроенная константа
DOING_AUTOSAVE
, чтобы убедиться, что пост не сохраняется автоматически. Если это так, функция завершит выполнение. -
Проверка прав пользователя: Убедитесь, что у текущего пользователя есть права на редактирование поста с помощью функции
current_user_can
. -
Добавление пользовательского поля: Используйте функцию
get_post_meta
, чтобы проверить, существует ли уже пользовательское поле "quality". Если поле пустое, используйтеupdate_post_meta
, чтобы установить значение "HD".
Дополнительные соображения
- Убедитесь, что все данные, которые вы вводите в поля, безопасны и проверяются. Используйте соответствующие функции для экранирования данных, если вы добавляете пользовательские вводимые данные.
- Обратите внимание, что данный код будет срабатывать каждый раз при сохранении поста. Если вам нужно устанавливать поле только при первой публикации, добавьте дополнительную логику, использующую статус поста:
if ($post->post_status == 'publish') {
// Ваш код для добавления пользовательского поля
}
Заключение
Данный подход обеспечит автоматическое добавление пользовательского поля "quality" со значением "HD" при публикации поста. Убедитесь, что вы проверили работоспособность кода на тестовом сайте, прежде чем внедрять его на рабочем проекте. Если возникнут трудности, не стесняйтесь обратиться к сообществу WordPress или к профессиональным разработчикам за помощью.