Wordpress создать новый статус сообщения? - PullRequest
12 голосов
/ 21 октября 2010

В Wordpress вы получаете статусы сообщений по умолчанию: «Опубликован», «Черновик» и «Ожидает рассмотрения».Можно ли добавить еще несколько типов записей, зарегистрировав их через файл function.php активной темы?

Также возможно ли редактировать ярлыки метабокса публикации?То, что я отправляю, на самом деле не публикуется ...

Также хотел бы добавить, я хочу, чтобы эти изменения вносились только тогда, когда я сделал в своем настраиваемом типе записи.

С уважением

Scott

Ответы [ 4 ]

18 голосов
/ 27 сентября 2011

Начиная с WP 3.0, вы можете использовать функцию register_post_status () (http://hitchhackerguide.com/2011/02/12/register_post_status/) для добавления новых статусов к типу поста.

Сам WP использует register_post_status () для регистрации стандартных статусов "опубликован", "черновик" и т. Д. В init с использованием функции create_initial_post_types () в wp-includes / post.php (http://hitchhackerguide.com/2011/02/11/create_initial_post_types/).

Посмотрите на код в этих ссылках, и вы сможете понять, как использовать функцию.

Надеюсь, это поможет вам начать!

2 голосов
/ 21 октября 2010

Вы можете написать плагин, если знаете как.Вы должны покопаться в документации или подобных плагинах, подобных этому http://wordpress.org/extend/plugins/edit-flow/ или этому http://wordpress.org/extend/plugins/custom-post-type-ui/

С помощью «Крюков, действий и фильтров» вы можете изменить интерфейс администратора, см. Здесь http://codex.wordpress.org/Plugin_API

Пока что я написал только один простой плагин, и я не знаю точных шагов, которые вы должны выполнить, чтобы выполнить это ...

Удачи!

1 голос
/ 04 ноября 2016
/**
 * PostStatusExtender
 * 
 * @author Hyyan Abo Fakher<hyyanaf@gmail.com>
 */
class PostStatusExtender
{

    /**
     * Extend 
     * 
     * Extend the current status list for the given post type 
     * 
     * @global \WP_POST $post
     * 
     * @param string $postType the post type name , ex: product
     * @param array $states array of states where key is the id(state id) and value
     *                      is the state array 
     */
    public static function extend($postType, $states)
    {

        foreach ($states as $id => $state) {
            register_post_status($id, $state);
        }

        add_action('admin_footer-post.php', function() use($postType, $states) {

            global $post;
            if (!$post || $post->post_type !== $postType) {
                return false;
            }

            foreach ($states as $id => $state) {

                printf(
                        '<script>'
                        . 'jQuery(document).ready(function($){'
                        . '   $("select#post_status").append("<option value=\"%s\" %s>%s</option>");'
                        . '   $("a.save-post-status").on("click",function(e){'
                        . '      e.preventDefault();'
                        . '      var value = $("select#post_status").val();'
                        . '      $("select#post_status").value = value;'
                        . '      $("select#post_status option").removeAttr("selected", true);'
                        . '      $("select#post_status option[value=\'"+value+"\']").attr("selected", true)'
                        . '    });'
                        . '});'
                        . '</script>'
                        , $id
                        , $post->post_status !== $id ? '' : 'selected=\"selected\"'
                        , $state['label']
                );

                if ($post->post_status === $id) {
                    printf(
                            '<script>'
                            . 'jQuery(document).ready(function($){'
                            . '   $(".misc-pub-section #post-status-display").text("%s");'
                            . '});'
                            . '</script>'
                            , $state['label']
                    );
                }
            }
        });


        add_action('admin_footer-edit.php', function() use($states, $postType) {

            global $post;

            if (!$post || $post->post_type !== $postType) {
                return false;
            }

            foreach ($states as $id => $state) {
                printf(
                        '<script>'
                        . 'jQuery(document).ready(function($){'
                        . " $('select[name=\"_status\"]' ).append( '<option value=\"%s\">%s</option>' );"
                        . '});'
                        . '</script>'
                        , $id
                        , $state['label']
                );
            }
        });

        add_filter('display_post_states', function($states, $post) use($states, $postType) {

            foreach ($states as $id => $state) {
                if ($post->post_type == $postType && $post->post_status === $id) {
                    return array($state['label']);
                } else {
                    if (array_key_exists($id, $states)) {
                        unset($states[$id]);
                    }
                }
            }

            return $states;
        }, 10, 2);
    }

}

А вот как использовать это

add_action('init', function() {
    PostStatusExtender::extend(self::NAME, array(
        'sold' => array(
            'label' => __('Sold', 'viasit'),
            'public' => true,
            'exclude_from_search' => true,
            'show_in_admin_all_list' => true,
            'show_in_admin_status_list' => true,
            'label_count' => _n_noop('Sold <span class="count">(%s)</span>', 'Sold <span class="count">(%s)</span>'),
        )
    ));
});

Редактировать: исправлена ​​опечатка в коде.

1 голос
/ 27 сентября 2011

Вы можете добавить пользовательский статус сообщения 'используя функцию register_post_status.Обратитесь к create_initial_post_types () в http://core.trac.wordpress.org/browser/tags/3.2.1/wp-includes/post.php

Однако имейте в виду, что это не интегрировано в пользовательский интерфейс Wordpress.

...