Вопрос или проблема
важно попытаться в роли обычного пользователя, а не администратора
Смотрите здесь, я действительно воспроизвел это. Похоже на баг, но не важно. Я хочу, чтобы пользователи выбирали свой slug. Поскольку нельзя сохранять post_name в ожидающих публикации записях, где мне его хранить? Где WordPress хранит slug, который выбирает пользователь, пока он еще в черновике / ожидании?
РЕДАКТИРОВАНИЕ
мой код, это работает, так как статус публикации:
$post_information = array(
'post_title' => 'Ваш заголовок',
'post_content' => 'блабла',
'post_type' => 'post',
'post_author' => wp_get_current_user()->ID,
'post_status' => 'publish',
'post_name' => "somerandomstuffthatisunique222"
);
$new_id = wp_insert_post( $post_information);
$postl = get_post($new_id);
это не работает
$post_information = array(
'post_title' => 'Ваш заголовок',
'post_content' => 'блабла',
'post_type' => 'post',
'post_author' => wp_get_current_user()->ID,
'post_status' => 'pending',
'post_name' => "somerandomstuffthatisunique2223434343434"
);
$new_id = wp_insert_post( $post_information);
в случае 2, post_name пустая строка после вставки.
автор не имеет значения
Когда вы используете графический интерфейс, post_name
сохраняется в таблице wp_posts
даже для черновиков после того, как вы измените значение по умолчанию.
Я попробовал ваш код (случай 2) и действительно вижу новую запись в базе данных с правильным post_name
. Возможно, ваша проверка post_name некорректна?
Ответ или решение
Вопрос о том, где хранить "slug" (пост_название) для поста в WordPress до его публикации, актуален для пользователей с ролью, отличной от администратора, например, для простых участников. Поведение WordPress таково, что "post_name" для постов со статусами "черновик" или "на проверке" не сохраняется должным образом, что может создавать трудности при предварительной настройке URL.
Теория (Theory)
С точки зрения теории, WordPress сохраняет данные о записи, включая её заголовок, содержание и прочие метаданные, в таблице wp_posts
. Однако "post_name" или "slug" формально начинает использоваться преимущественно для опубликованных постов. В случае черновиков или ожидающих публикации материалов, WordPress не всегда записывает "post_name", что может быть результатом ограничений или багов в системе.
Пример (Example)
Как заявлено в вашем примере, код, устанавливающий "post_name" для опубликованного поста, успешно сохраняет это значение:
$post_information = array(
'post_title' => 'Your title',
'post_content' => 'blabla',
'post_type' => 'post',
'post_author' => wp_get_current_user()->ID,
'post_status' => 'publish',
'post_name' => "somerandomstuffthatisunique222"
);
$new_id = wp_insert_post($post_information);
$postl = get_post($new_id);
Однако попытка сохранить "post_name" для поста в статусе "на проверке" приводит к тому, что значение не сохраняется:
$post_information = array(
'post_title' => 'Your title',
'post_content' => 'blabla',
'post_type' => 'post',
'post_author' => wp_get_current_user()->ID,
'post_status' => 'pending',
'post_name' => "somerandomstuffthatisunique2223434343434"
);
$new_id = wp_insert_post($post_information);
Применение (Application)
Для решения данной проблемы можно применить несколько подходов:
-
Использование метаданных: Храните нужные вам данные в пользовательских метаданных поста. Вы можете добавить пользовательское поле с помощью функции
add_post_meta()
, чтобы сохранять "post_name" в виде метаполя до тех пор, пока пост не будет опубликован.$new_id = wp_insert_post($post_information); add_post_meta($new_id, '_custom_post_name', "somerandomstuffthatisunique2223434343434", true);
-
Обработка при публикации: При публикации поста вы можете перенести значение из метаданных в "post_name" с использованием хуков WordPress. Например, при сохранении или изменении статуса поста:
add_action('transition_post_status', 'my_save_post_name', 10, 3); function my_save_post_name($new_status, $old_status, $post) { if ('publish' === $new_status && 'pending' === $old_status) { $post_name = get_post_meta($post->ID, '_custom_post_name', true); if ($post_name) { wp_update_post(array( 'ID' => $post->ID, 'post_name' => $post_name )); } } }
Заключение
Подобные проблемы часто встречаются при разработке с использованием WordPress, и решение через пользовательские метаданные и хуки представляется наиболее гибким и безопасным способом обойти данное ограничение системы. Такой подход позволит вам сохранять необходимую информацию до публикации поста, не нарушая логику работы WordPress.