Definir um sub-caminho personalizado para o blog sem usar páginas?

4

Aviso: solicitação bastante pedante à frente.

Eu tenho um design que usa postagens (ou seja, o blog) e um tipo de post personalizado chamado "howto". A página inicial do site ("/") tem um modelo que exibe as últimas postagens do blog e os últimos howtos. Quando o usuário navega para a seção do blog ("/ blog"), eles vêem um modelo diferente do que quando navegam para a seção howto ("/ howto").

Eu sei que a maneira óbvia de fazer isso é criar duas páginas ("Blog" e "Home"), então use as listas suspensas em Configurações- > Opções de leitura para defini-las explicitamente. Posso associar modelos de páginas específicos a essas postagens.

Mas, se isso não for realmente confuso - eu terei duas páginas vazias inúteis bagunçando qualquer lista de páginas do administrador com conteúdo real nelas. Você pensaria que haveria alguma maneira de usar dicas de modelo para evitar que isso fosse necessário:

  • / howto / - > archive-howto.php
  • / blog / - > arquivo.php

Então, na verdade, acho que a pergunta é a seguinte:

Como alguém define um caminho personalizado para postagens sem criar uma nova página?

    
por aendrew 10.10.2012 / 14:06

3 respostas

7

Não tenho tempo para explicar isso em detalhes (voltarei) mas enquanto isso deve funcionar para você,

Answer updated with explanation as promised.
WP Rewrite rules are like voodoo, I'm sure there's more than one way to go about this, but here's mine.

Problema:

Para esclarecer sua dúvida para outras pessoas que podem se deparar com este tópico, o que você quer fazer é criar uma página sem ter que criar fisicamente um vazio -placeholder-page dentro do painel de administração encontrado em: Page -> Add New .

Essencialmente, você deseja criar uma Página Falsa e fazer com que essa página use qualquer modelo que você especificar.

Solução:

Primeiro, configuramos nossas regras de reescrita,

add_action('init', 'fake_page_rewrite');

function fake_page_rewrite(){

    global $wp_rewrite;

    //set up our query variable %fake_page% which equates to index.php?fake_page= 
    add_rewrite_tag( '%fake_page%', '([^&]+)'); 

    //add rewrite rule that matches /blog/page/2, /blog/page/3, /blog/page/4, etc..
    add_rewrite_rule('^blog/page/?([0-9])?','index.php?fake_page=blog&paged=$matches[1]','top');  

    //add rewrite rule that matches /blog
    add_rewrite_rule('^blog/?','index.php?fake_page=blog','top');

    //add endpoint, in this case 'blog' to satisfy our rewrite rule /blog, /blog/page/ etc..
    add_rewrite_endpoint( 'blog', EP_PERMALINK | EP_PAGES );

    //flush rules to get this to work properly
    $wp_rewrite->flush_rules();

}

Dentro do add_rewrite_tag , especificamos nossa variável de consulta na forma de% fake_page%, que, a propósito, você pode especificar o que quiser ou se adequar às suas necessidades. Meu exemplo fake_page é apenas simbólico para ilustrar a mecânica dessa resposta.

Como a variável de consulta funciona nesta instância é combinando uma solicitação para

http://www.example.com/blog

... que é então mapeado internamente para

http://www.example.com/index.php?fake_page=blog

O último é o que você veria ao executar a estrutura de permalink padrão.

De uma forma semelhante, pedidos para

http://www.example.com/blog/page/2
http://www.example.com/blog/page/3
http://www.example.com/blog/page/4
etc...

... cada um mapearia seus equivalentes,

http://www.example.com/index.php?fake_page=blog&paged=2
http://www.example.com/index.php?fake_page=blog&paged=3
http://www.example.com/index.php?fake_page=blog&paged=4
etc...

No snippet de exemplo acima, você notará que temos a regra de regravação que corresponde à paginação /blog/page/{page_number} , acima da nossa segunda regra, que corresponde à base da nossa página falsa de /blog .

Isso é necessário para que a regra de base não retorne uma correspondência na primeira ocorrência de nosso ponto de extremidade, que é definido como blog , antes de ter a chance de avaliar o restante da URL solicitada para garantir que o usuário não tenha De fato, solicitou um resultado paginado. Basicamente, inverta essas regras e isso não funciona.

  

Como mencionado anteriormente, as regras de reescrita são como vodu para mim, então há   provavelmente outra maneira de ir sobre a ordem em que você especificar   suas regras que possivelmente estão relacionadas ao uso da função add_permastruct . E se   qualquer um tem uma alternativa, então entra em ação!

A próxima função que engancha em template_redirect verifica a existência de nosso fake_page dentro das variáveis de consulta, se ela corresponder / existir dentro da matriz, então solicitaremos a inclusão de nosso arquivo de modelo desejado para manipular a apresentação de dados .

add_action('template_redirect', 'fake_page_redirect');

    function fake_page_redirect(){

        global $wp;

        //retrieve the query vars and store as variable $template 
        $template = $wp->query_vars;

        //pass the $template variable into the conditional statement and
        //check if the key 'fake_page' is one of the query_vars held in the $template array
        //and that 'blog' is equal to the value of the key which is set
        if ( array_key_exists( 'fake_page', $template ) && 'blog' == $template['fake_page'] ) {

            //if the key 'fake_page' exists and 'blog' matches the value of that key
            //then return the template specified below to handle presentation
            include( get_template_directory().'/your-template-name-here.php' );

            exit;

        }
    }

PS. I have tested this and it works under my conditions, though I'm not sure if any other quirks may popup with rewrite rules and end point masks the deeper you go, therefore you should thoroughly test all pagination and permalinks and make sure that they resolve to their intended paths correctly . If not, we can address those issues as they arise.

    
por userabuser 13.10.2012 / 21:50
0

Crie duas páginas de arquivo.

archive.php para seus posts, e archive-howto.php para o seu howtos.

enlace

Fazer páginas falsas e futzing com as reescritas é muito exagerado e um pouco perigoso.

A não ser que eu tenha perdido completamente o objetivo.

    
por Joseph Carrington 27.03.2013 / 21:08
-1

Talvez você esteja procurando por isso:

<?php

define ('HOWTO_SLUG', 'my_howtos');
define ('HOWTO_REWRITE_SLUG', 'howtos');

register_post_type (HOWTO_SLUG,
    array
    (
        'labels' => array
        (
            'name' => 'Howtos'
            , 'singular_name' => 'Howto'
        )
        , 'public' => true
        , 'has_archive' => true
        , 'rewrite' => array ('slug' => HOWTO_REWRITE_SLUG)
    )
);

Essas postagens aparecerão no administrador do WP com post_type=my_howtos , enquanto no lado do público as URL-s aparecerão como /howtos/ e o arquivo archive-my_howtos.php no tema será usado para exibir a página.

O HOWTO_SLUG e o HOWTO_REWRITE_SLUG não podem ser iguais ou serão interrompidos.

    
por gregn3 10.10.2012 / 15:10