Новый статус записи для произвольного типа записей

4 мар. 2013 г., 19:34:58
Просмотры: 33.8K
Голосов: 18

У меня есть произвольный тип записей 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' );

Спасибо за помощь.

4
Комментарии

Я думаю, код правильный. Возможно, у вас этот источник находится в другой функции, из которой нужно его вызвать. Когда выполняется add_action()?

bueltge bueltge
4 мар. 2013 г. 21:36:55

Не могли бы вы подробнее объяснить ваш ответ? Спасибо!

AltDan AltDan
5 мар. 2013 г. 00:03:18

Находится ли add_action('init') внутри класса или функции, где вы вызываете другой хук? Возможно, вы запускаете это слишком поздно, и хук init уже не может сработать.

bueltge bueltge
5 мар. 2013 г. 16:13:38

Как вы решили эту проблему? У меня сейчас точно такая же ситуация. Я хочу добавить новый пользовательский статус в выпадающий список в админке пользовательских записей, чтобы пользователь мог выбирать (Ожидает проверки, Черновик, НОВЫЙ_СТАТУС) из списка статусов...

Greeso Greeso
24 авг. 2013 г. 12:19:41
Все ответы на вопрос 4
4
15

Есть отличное пошаговое описание, как это сделать здесь 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 минут, что сэкономило мне кучу времени!

8 нояб. 2013 г. 19:21:43
Комментарии

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

rinogo rinogo
1 авг. 2019 г. 05:55:24

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

Larzan Larzan
2 авг. 2019 г. 14:01:07

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

joehanna joehanna
1 февр. 2022 г. 02:57:39

Спасибо @joehanna, я обновил ссылку :)

Larzan Larzan
3 февр. 2022 г. 12:58:17
0
10

Ваш код должен быть корректным и добавлять нужный статус в глобальный массив $wp_post_statuses.

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

5 мар. 2013 г. 02:28:40
1
10

Регистрация статуса записи "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;
});
14 сент. 2018 г. 22:57:22
Комментарии

Именно то, что я искал. Однако в выпадающем списке статусов при массовом редактировании записей всё ещё отсутствует пользовательский статус записи.

martin schwartz martin schwartz
4 сент. 2019 г. 19:39:01
0

Вот рабочий код для 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>';
});
31 мар. 2023 г. 13:28:47