GoPymes's Blog

register_post_status no agrega los estados nuevos al admin panel

Como dice el título de esta publicación, cuando usas las función register_post_status crea internamente los nuevos estados del post, sin embargo al entrar y crear un post nuevo te tomarás con la sorpresa que no aparece tu nuevo estado creado. Entrando al Codex de WordPress verás el mensaje:

[notification type=”alert-warning” close=”false” ]
NOTICE:
This function does NOT add the registered post status to the admin panel. This functionality is pending future development. Please refer to Trac Ticket #12706. Consider the action hook post_submitbox_misc_actions for adding this parameter.
[/notification]

Nos explica que esta función no mostrará tu nuevo estado en el admin panel, incluso te da el número de ticket pues en futuras versiones de WordPress será implementado correctamente.

No vamos a esperar a que WP actualice su codex, así que haremos un jugada para mostrarlo en el admin panel, todos los código se colocan en functions.php.

Registramos un nuevo estado

1
2
3
4
5
6
7
8
9
10
11
add_action( 'init', 'custom_post_status');
function custom_post_status(){
    register_post_status( 'expired', array(
        'label'                     => 'Vencido',
        'public'                    => true,
        'exclude_from_search'       => false,
        'show_in_admin_all_list'    => true,
        'show_in_admin_status_list' => true,
        'label_count'               => _n_noop( 'Vencido <span class="count">(%s)</span>', 'Vencidos <span class="count">(%s)</span>' ),
    ) );
}

Agregamos el nuevo estado al panel administrativo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
add_action('admin_footer-post.php', 'append_post_status_list');
function append_post_status_list(){
    global $post;
    $complete=$label='';
    if($post->post_type == 'post'){
        if($post->post_status == 'expired'){
            $complete = ' selected="selected"';
            $label = '<span id="post-status-display"> Vencido</span>';
        }
        echo '
            <script>
                jQuery(document).ready(function($){
                    $("select#post_status").append("<option value="expired" '
.$complete.'>Vencido</option>");
                    $(".misc-pub-section label").append("'
.$label.'");
                });
            </script>
        '
;
    }
}

Con esto lograremos presentar el estado en el combo select del admin panel como la sgte imágen:
post_status

Además, también mostrará un link en los filtros del listado de tus publicaciones como la siguiente imágen:
wordpress

Mostrar el nuevo estado al lado del titulo del post

Ahora necesitamos mostrarlo además en todo el listado de publicaciones, para así a simple vista poder verlo al costado de cada titulo.

1
2
3
4
5
6
7
8
9
10
11
12
add_filter( 'display_post_states', 'display_state' );
function display_state( $states ) {
    global $post;
    $arg = get_query_var( 'post_status' );

    if($arg != 'expired'){
        if($post->post_status == 'expired'){
            return array('Expirado');
        }
    }
    return $states;
}

Gracias a este código podremos verlo como la imágen siguiente
expirado

Leave a Reply

Your email address will not be published. Required fields are marked *