Новый статус записи для произвольного типа записей
У меня есть произвольный тип записей recipes
. Я использую cron-скрипт для автоматической агрегации новостей в базу данных.
В настоящее время они импортируются и сохраняются со статусом 'На утверждении'. Возможно ли создать другой статус записи под названием Aggregated
, который будет отображать все агрегированные новости для публикации?
Я пытался использовать функцию register_post_status
, однако это не сработало:
function custom_post_status(){
register_post_status( 'aggregated', array(
'label' => _x( 'Агрегировано', 'recipes' ),
'public' => false,
'exclude_from_search' => true,
'show_in_admin_all_list' => true,
'show_in_admin_status_list' => true,
'label_count' => _n_noop( 'Агрегировано <span class="count">(%s)</span>', 'Агрегировано <span class="count">(%s)</span>' ),
) );
}
add_action( 'init', 'custom_post_status' );
Спасибо за помощь.

Есть отличное пошаговое описание, как это сделать здесь https://www.jclabs.co.uk/create-custom-post-status-in-wordpress-using-register_post_status/
Чтобы добавить свой пользовательский статус записи в выпадающее меню, просто добавьте следующий код в functions.php вашей темы:
add_action('admin_footer-post.php', 'jc_append_post_status_list');
function jc_append_post_status_list(){
global $post;
$complete = '';
$label = '';
if($post->post_type == 'recipes'){
if($post->post_status == 'aggregated'){
$complete = ' selected=\"selected\"';
$label = '<span id=\"post-status-display\"> Aggregated</span>';
}
echo '
<script>
jQuery(document).ready(function($){
$("select#post_status").append("<option value=\"aggregated\" '.$complete.'>Aggregated</option>");
$(".misc-pub-section label").append("'.$label.'");
});
</script>
';
}
}
Таким образом, вы сможете реализовать пользовательский статус записи всего за 5 минут, что сэкономило мне кучу времени!

Ссылка не работает. Вот последняя версия на archive.org.

@rinogo спасибо, переключился на ссылку archive.org, которую ты предоставил

Вот обновленная ссылка на статью на новом сайте James Collings: https://www.jclabs.co.uk/create-custom-post-status-in-wordpress-using-register_post_status/

Ваш код должен быть корректным и добавлять нужный статус в глобальный массив $wp_post_statuses
.
Однако, если вы ожидаете, что статус появится в выпадающем списке админки, то это известная проблема: https://core.trac.wordpress.org/ticket/12706

Регистрация статуса записи "aggregated" для пользовательского типа записей "recipes":
register_post_status( 'aggregated', array(
'label' => _x( 'Агрегированный', 'метка статуса записи', 'plugin-domain' ),
'public' => true,
'label_count' => _n_noop( 'Агрегированные <span class="count">(%s)</span>', 'Агрегированные <span class="count">(%s)</span>', 'plugin-domain' ),
'post_type' => array( 'recipes' ), // Определяем один или несколько типов записей, к которым можно применить статус.
'show_in_admin_all_list' => true,
'show_in_admin_status_list' => true,
'show_in_metabox_dropdown' => true,
'show_in_inline_dropdown' => true,
'dashicon' => 'dashicons-businessman',
) );
Добавление пользовательского статуса записи в выпадающий список метабокса публикации на экране редактирования записей типа "recipes" и изменение текста кнопки "Сохранить черновик", если выбран статус "aggregated":
add_action('admin_footer-post.php',function(){
global $post;
$complete = '';
$label = '';
if($post->post_type == 'recipes') {
if ( $post->post_status == 'aggregated' ) {
$complete = ' selected=\"selected\"';
$label = 'Агрегированный';
}
$script = <<<SD
jQuery(document).ready(function($){
$("select#post_status").append("<option value=\"aggregated\" '.$complete.'>Агрегированный</option>");
if( "{$post->post_status}" == "aggregated" ){
$("span#post-status-display").html("$label");
$("input#save-post").val("Сохранить агрегированный");
}
var jSelect = $("select#post_status");
$("a.save-post-status").on("click", function(){
if( jSelect.val() == "aggregated" ){
$("input#save-post").val("Сохранить агрегированный");
}
});
});
SD;
echo '<script type="text/javascript">' . $script . '</script>';
}
});
Добавление пользовательского статуса записи в окно быстрого редактирования в админ-панели:
add_action('admin_footer-edit.php',function() {
global $post;
if( $post->post_status == 'recipes' ) {
echo "<script>
jQuery(document).ready( function() {
jQuery( 'select[name=\"_status\"]' ).append( '<option value=\"aggregated\">Агрегированный</option>' );
});
</script>";
}
});
Отображение общего количества записей с пользовательским статусом в админ-панели:
add_filter( 'display_post_states', function( $statuses ) {
global $post;
if( $post->post_type == 'recipes') {
if ( get_query_var( 'post_status' ) != 'aggregated' ) { // не для страниц со всеми записями этого статуса
if ( $post->post_status == 'aggregated' ) {
return array( 'Агрегированный' );
}
}
}
return $statuses;
});

Вот рабочий код для WordPress 6.2 без использования jQuery
// 1. Регистрация статуса записи "aggregated" (агрегировано)
add_action('init', 'add_custom_post_status');
function add_custom_post_status()
{
register_post_status('aggregated', array(
'label' => _x('Агрегировано', 'recipes'),
'public' => true,
'show_in_admin_all_list' => true,
'show_in_admin_status_list' => true,
'label_count' => _n_noop('Агрегировано<span class="count">(%s)</span>', 'Агрегировано <span class="count">(%s)</span>'),
));
}
// 2. На экране редактирования записи: добавление кастомного статуса в выпадающий список
add_action('admin_footer-post.php', 'append_post_status_list');
function append_post_status_list()
{
global $post;
if ($post->post_type != 'recipes') {
return;
}
$selected = 'false';
$setStatus = '';
if ($post->post_status == 'aggregated') {
$selected = 'true';
$setStatus = 'document.getElementById("post-status-display").innerHTML = "Агрегировано";';
}
echo '
<script>
document.getElementById("post_status").appendChild(new Option("Агрегировано", "aggregated", ' . $selected . '));
' . $setStatus . '
</script>
';
}
// 3. На экране быстрого редактирования (список записей): добавление кастомного статуса в выпадающий список
add_action('admin_footer-edit.php', function () {
global $post;
if ($post->post_type != 'recipes') {
return;
}
echo '
<script>
document.querySelectorAll("select[name=\"_status\"]").forEach((s) => {
s.appendChild(new Option("Агрегировано", "aggregated"));
});
</script>';
});
