Establecer el listado predeterminado "Ver" en Admin

8

Estoy buscando una manera de establecer las opciones predeterminadas de "Ver" en los tipos de publicación en el área de administración. Por ejemplo, las publicaciones predeterminadas mostrarán de forma predeterminada una vista de "lista" en lugar de "extracto". Me gustaría cambiar esto a extracto de forma predeterminada. ¿Cuál sería la mejor manera de lograr esto? He buscado un poco sobre esto, pero hasta ahora estoy atrapado en el barro. Cualquier ayuda sería muy apreciada. ¡Gracias!

Zach
fuente

Respuestas:

9

Aunque tener la característica de configuraciones persistentes en el núcleo es bueno, puede tomar bastante tiempo antes de que sea realmente aceptado. WordPress 3.5 todavía está bastante lejos.

Entonces, aumentemos la $_REQUESTmatriz global en su lugar.

add_action( 'load-edit.php', 'wpse34956_force_excerpt' );
function wpse34956_force_excerpt() {
    $_REQUEST['mode'] = 'excerpt';
}

Esto bloqueará los modos, forzando el excerptmodo todo el tiempo, así que vamos a dejar que el usuario decida pero que sea persistente utilizando los metadatos del usuario:

add_action( 'load-edit.php', 'wpse34956_persistent_posts_list_mode' );
function wpse34956_persistent_posts_list_mode() {
    if ( isset( $_REQUEST['mode'] ) ) {
        // save the list mode
        update_user_meta( get_current_user_id(), 'posts_list_mode', $_REQUEST['mode'] );
        return;
    }
    // retrieve the list mode
    if ( $mode = get_user_meta( get_current_user_id(), 'posts_list_mode', true ) )
        $_REQUEST['mode'] = $mode;
}

Puede interpolar aún más post_typeen todos teniendo en cuenta la $_GET['post_type']variable cuando esté disponible.

add_action( 'load-edit.php', 'wpse34956_persistent_posts_list_mode' );
function wpse34956_persistent_posts_list_mode() {

    // take into account post types that support excerpts
    $post_type = isset( $_GET['post_type'] ) ? $_GET['post_type'] : '';
    if ( $post_type && !post_type_supports( $post_type, 'excerpt' ) )
        return; // don't care

    if ( isset( $_REQUEST['mode'] ) ) {
        // save the list mode
        update_user_meta( get_current_user_id(), 'posts_list_mode' . $post_type, $_REQUEST['mode'] );
        return;
    }

    // retrieve the list mode
    if ( $mode = get_user_meta( get_current_user_id(), 'posts_list_mode' . $post_type, true ) )
        $_REQUEST['mode'] = $mode;
}

¡Viola! Modo de lista persistente por tipo de publicación por usuario, sin hacks.

soulseekah
fuente
1
Buena solución. ¡Obtuve una mucho más fácil poco después de poner una recompensa por esto! Pero, dado que tiene la solución, le daré la recompensa, aunque creo que incorporaré su camino, ya que en realidad es persistente y no como el comportamiento predeterminado, excepto con un extracto en lugar de una lista. Editar, puede otorgarlo en 17 horas, así que tengan paciencia conmigo!
Hosh Sadiq
Gracias, me alegro de haber sido de ayuda. Una pregunta muy interesante.
soulseekah
Gracias por esto @soulseekah, también usé esto y funciona muy bien Como mencionó en ese momento "WordPress 3.5 todavía está bastante lejos": ¿sigue siendo bueno usar este código con la última versión de WordPress?
user3438958
5

La pantalla de vista posterior cambia de la vista de lista a la vista de extracto según el valor del parámetro "modo" en la cadena de consulta. Si el parámetro "modo" no está configurado, entonces WordPress se predetermina a la vista de lista.

Desafortunadamente, este parámetro no se puede filtrar, por lo que no hay una manera fácil de controlarlo mediante programación.

Así que voy a hacer algo que nunca hago ... Te diré cómo hackear Core para que esto funcione ...

Agregar un filtro

Abra /wp-admin/includes/class-wp-posts-list-table.phpy encuentre el prepare_items()método (alrededor de la línea 81).

En la línea 99, WordPress verifica si el parámetro "modo" se configuró o no en la solicitud y lo utiliza para establecer la $modevariable global :

$mode = empty( $_REQUEST['mode'] ) ? 'list' : $_REQUEST['mode'];

Vamos a cambiar esta línea para filtrar la configuración predeterminada. Cambie esta línea a:

$mode = empty( $_REQUEST['mode'] ) ? apply_filters( 'default-posts-list-mode', 'list' ) : $_REQUEST['mode'];

Ahora, vaya al functions.phparchivo de su tema y agregue el siguiente código:

add_filter( 'default-posts-list-mode', 'my_default_posts_list_mode' );
function my_default_posts_list_mode( $default ) {
    return 'excerpt';
}

Esto se conectará al filtro y volverá al modo de extracto de forma predeterminada.

Dado que mi regla personal sobre la piratería de Core requiere que todos los hacks se contribuyan de nuevo al proyecto (de esta manera, pueden incorporarse a Core y ya no contar como un hack), abrí un ticket de Trac para esta mejora y envié el código anterior como un parche Por favor, evalúe el boleto para que pueda entrar en el núcleo para 3.5 (estamos demasiado tarde en el ciclo para 3.4, pero podemos intentar avanzar para la próxima versión).

EAMann
fuente
1
Muy genial. Definitivamente pensar "esto" es una razón para cortar el núcleo - por lo que en el futuro, usted no tiene que :)
Zach
1
También hay una discusión en curso sobre este ticket, más un parche adicional que propone una opción de usuario en lugar de solo un filtro. Haga un seguimiento de esa conversación si decide piratear Core ... porque si / cuando las cosas cambien en una versión futura, también necesitará cambiar su código.
EAMann
¿Por qué no simplemente hackear el $_REQUESTglobal add_action( 'edit.php', ... )y cosas por el estilo, mientras esperamos que Core adopte el parche / propuesta?
soulseekah
@Soulseekah Buena alternativa ... simplemente no soy fanático de hackear el $_REQUESTobjeto yo mismo. Siéntase libre de publicar otra respuesta que describa cómo se podría hacer.
EAMann
1
+1 por llevarlo al centro con algunos parches geniales, esperamos ver pronto los conjuntos de cambios.
soulseekah
2

De acuerdo, poco después de poner una recompensa, se me ocurrió la siguiente solución. Es el comportamiento predeterminado en todos los sentidos, excepto que selecciona la vista de extracto para cualquier tipo de publicación que desee (en lugar de la vista de lista predeterminada).

<?php

add_action( 'admin_init', 'my_admin_init' ); // initiate admin hook

function my_admin_init() {
    // if mode is not set redirect to a default mode.
    if(!isset($_GET['mode'])) {
        if('forms' == $_GET['post_type'] || 'client-quotes' == $_GET['post_type'] ) {
            wp_redirect( admin_url( 'edit.php?mode=excerpt&' . http_build_query( $_GET ) ) );
            exit;
        }
    }
}

?>

NOTA: Recomiendo el enfoque de Soulseekah, si no desea que recuerde la elección del usuario, puede incorporar un poco mi código con su código. NOTA 2: Si / cuando el parche de EAMann es parte del núcleo, obviamente su método sería el mejor, ya que no requeriría que recorrieras el camino. Simplemente no me gusta en este momento, ya que tienes que editar los archivos principales.

Hosh Sadiq
fuente
1
Esto tiene sentido. Sin embargo, pagedno se tiene en cuenta (paginación) + usar en wp_redirectlugar de encabezados sin formato podría ser un poco "más limpio", y no estoy seguro de cuán eficiente es la redirección. Aparte de eso, parece interesante. Además, es $_GET['post_type']posible que no se configure, lo que genera una advertencia si se activan los errores. +1 por el esfuerzo y la paciencia. No me di cuenta de que la pregunta era tan antigua.
soulseekah
2
Mi problema con este enfoque es que implica una redirección. Por lo tanto, está cargando WP no una vez, sino dos veces solo para llegar a la página de listado de publicaciones.
EAMann
@Soulseekah, tienes razón, no lo pensé bien, he actualizado el código para tener en cuenta todas las $_GETvariables. En cuanto a $_GET['post_type'], sinceramente, no me molestó demasiado eso, ya que solo requería que fuera para un tipo de publicación personalizado, que siempre estaría allí. Obviamente esto se puede omitir. @EAMann, tienes razón, sin embargo, esta fue la mejor solución que se me ocurrió. Intenté configurar manualmente los $_GETparámetros, esperando que se estableciera ANTES de que se leyera, pero esto no parece ser el caso.
Hosh Sadiq