Definir a listagem padrão "Visualizar" em Admin

8

Estou procurando uma maneira de definir as opções "Visualizar" padrão em tipos de postagem na área de administração. Por exemplo, por padrão, as postagens serão padronizadas para uma exibição de "lista" em vez de "trecho" - eu gostaria de alterar isso para trecho por padrão - qual seria a melhor maneira de conseguir isso? Pesquisei um pouco sobre isso, mas estou preso na lama até agora. Qualquer ajuda seria muito apreciada. Obrigado!

Zach
fonte

Respostas:

9

Embora seja bom ter o recurso de configurações persistentes no núcleo, pode demorar um pouco até que seja realmente aceito. O WordPress 3.5 ainda está muito longe.

Então, vamos aumentar a $_REQUESTmatriz global .

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

Isso bloqueará os modos, forçando o excerptmodo o tempo todo, então vamos deixar o usuário decidir, mas mantê-lo persistente usando os metadados do usuário:

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;
}

Você pode interpolar ainda mais, post_typeconsiderando a $_GET['post_type']variável quando disponível.

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 postagem por usuário, sem hacks.

soulseekah
fonte
11
Boa solução. Ficou muito mais fácil logo depois que eu coloquei uma recompensa por isso! Mas, como você tem a solução, eu lhe darei a recompensa, embora eu ache que vou incorporar o seu caminho, pois isso é realmente persistente e não como o comportamento padrão, exceto com trecho em vez de lista. Edit, pode premiá-lo em 17 horas, então tenha paciência comigo!
Hosh Sadiq
Obrigado, feliz por ter sido útil. Uma pergunta muito interessante.
soulseekah
Obrigado por este @soulseekah, eu usei isso também e funciona muito bem. Como você mencionou na época "O WordPress 3.5 ainda está muito longe" - esse código ainda é bom para usar com a versão mais recente do WordPress?
user3438958
5

A tela de exibição de postagem alterna da exibição de lista para a exibição de trechos com base no valor do parâmetro "mode" na string de consulta. Se o parâmetro "mode" não estiver definido, o WordPress usará como padrão a exibição em lista.

Infelizmente, esse parâmetro não é filtrável, portanto não há uma maneira fácil de controlá-lo programaticamente.

Então, farei algo que nunca faço ... Vou lhe dizer como hackear o Core para fazer isso funcionar ...

Adicionando um filtro

Abra /wp-admin/includes/class-wp-posts-list-table.phpe encontre oprepare_items() método (em torno da linha 81).

Na linha 99, o WordPress verifica se o parâmetro "mode" foi ou não definido na solicitação e o usa para definir a $modevariável global :

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

Vamos mudar essa linha para filtrar a configuração padrão. Mude esta linha para:

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

Agora, entre no functions.phparquivo do seu tema e adicione o seguinte código:

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

Isso entrará no filtro e retornará o modo de trecho por padrão.

Como minha regra pessoal sobre hackers do Core exige que todos os hacks sejam contribuídos de volta para o projeto (dessa forma, eles podem ser lançados no Core e não mais contar como hack), abri um ticket do Trac para esse aprimoramento e enviei o código acima como um patch. Por favor, avalie o ticket para que ele possa entrar no core para 3.5 (estamos muito atrasados ​​no ciclo para 3.4, mas podemos tentar levar isso adiante para a próxima versão).

EAMann
fonte
11
Muito legal. Definitivamente acho que "isto" é uma razão para cortar o núcleo - lo no futuro, você não tem que :)
Zach
11
Também há discussões em andamento sobre esse ticket - além de um patch adicional que propõe uma opção de usuário em vez de apenas um filtro. Acompanhe essa conversa se você decidir realmente hackear o Core ... porque se / quando as coisas mudarem em uma versão futura, você também precisará alterar seu código.
EAMann
Por que não invadir o $_REQUESTmundo todo add_action( 'edit.php', ... )e assim por diante , enquanto esperamos que o núcleo adote o patch / proposta?
soulseekah
@Soulseekah Boa alternativa ... não sou fã de hackear o $_REQUESTobjeto. Sinta-se à vontade para postar outra resposta descrevendo como isso pode ser feito.
EAMann
11
+1 por colocá-lo no caminho do núcleo com alguns ótimos patches, esperamos ver os conjuntos de alterações em breve.
soulseekah
2

Ok, logo depois de oferecer uma recompensa, vim com a seguinte solução. É o comportamento padrão em todos os aspectos, exceto que ele seleciona a exibição de trechos para qualquer tipo de publicação que você deseja (em vez da exibição de lista padrão).

<?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: Recomendo a abordagem de Soulseekah, se você não quiser se lembrar da escolha do usuário, poderá incorporar um pouco meu código ao código dele. NOTA 2: Se / quando o patch do EAMann fizer parte do núcleo, obviamente o método dele seria o melhor, pois não exigiria que você percorresse o caminho mais longo. Só não gosto no momento, pois você precisa editar os arquivos principais.

Hosh Sadiq
fonte
11
Isso faz sentido. No entanto, pagednão é levado em consideração (paginação) + o uso em wp_redirectvez de cabeçalhos brutos pode ser um pouco "mais limpo", e não tenho certeza da eficiência do redirecionamento. Fora isso parece interessante. Além disso, $_GET['post_type']pode não estar definido, resultando em um aviso se os erros estiverem ativados. +1 pelo esforço e paciência. Não sabia que a pergunta era tão antiga.
soulseekah
2
Meu problema com essa abordagem é que ela envolve um redirecionamento. Então você está carregando o WP não apenas uma vez, mas duas vezes apenas para acessar a página de listagem de postagens.
EAMann
@Soulseekah, você está certo, não pensou nisso, atualizei o código para levar em conta todas as $_GETvariáveis. Quanto ao $_GET['post_type'], honestamente, eu não estava muito preocupado com isso, pois eu apenas exigia que fosse para um tipo de postagem personalizado, que sempre estaria lá. Obviamente, isso pode ser omitido. @EAMann, Você está certo, no entanto, esta foi a melhor solução que eu poderia encontrar. Tentei definir $_GETparâmetros manualmente , esperando que fosse definido antes de ser lido, mas isso não parecia ser o caso.
Hosh Sadiq