Associando posts com páginas Por Ezequiel dia 19 de dezembro de 2008 às 3:43 pm | Imprimir este post

Primeiramente: Oi e desculpe. Faz muito tempo desde meu último post, na verdade faz muito tempo que não posto em lugar nenhum (incluindo a comunidade do Wordpress Brasil que nunca mais “pisei lá”). Bom, minhas horas vagas que normalmente utilizaria para postar em fóruns e no meu site ocupo com outros afazeres de fim de ano, ainda não consegui arranjar tempo para botar meu site de volta no ar e minha pauta no trabalho só cresce. Mas enfim, estou aqui e tenho uma ótima dica pra dividir com vocês, é muito simples e muito útil, tive que usar recentemente para criar um sistema de FAQ pelo gerenciador do WP. Então vamos ao que interessa.
É de conhecimento de todos (ou quase todos) que utilizam o WP que ao criar um página é possível encaixar ela dentro de outra página, a chamada hierarquia de mãe e filhos (mother and children). É muito simples, porém útil. A idéia é basicamente criar uma página que poderá ser filha de outra página ou não. Ou seja, se ela não for filha de nenhuma página ela estará na raiz da hierarquia, mas se ela for uma página filha ela estará associada a uma outra página, assim estando abaixo dela. Um exemplo de hierarquia:

  • Sobre nós (mãe na raíz)
    • Parceiros (filho de “Sobre nós”)
    • Organização (filho de “Sobre nós” e mãe de “Funcionários”)
      • Funcionários (filho de “Organização”)
    • Compromissos (filho de “Sobre nós”)

Bom, agora que entenderam a idéia de mother and children, vamos a próxima explicação: Quando escrevemos um post relacionamos categorias a ele, essa é a hierarquia de associação de posts, ou seja, para as páginas o método de associação é M&C (mother and children) enquanto que em posts são as categorias. Got it? Pois bem, o princípio dessa dica é poder além de associar posts a categorias, associar posts a páginas. O “custo” para criar um plugin que faça isso é praticamente zero, tudo já fornecido pelo Wordpress. A idéia é replicar o método de associação de páginas M&C para funcionar em posts. Essa é a hora que você pergunta: Com qual propósito? E eu repondo: Lembra da hierarquia exemplo que eu passei logo acima, imagine que você faz o layout da página Funcionários, não seria bacana criar posts com o titulo do nome do funcionário e uma descrição sobre ele e associar esses posts a página “Funcionários” e listar os mesmos, ao invés de criar a categoria “Funcionários” ou uma outra página? Assim podendo selecionar categorias para esse post. Pois bem, esse é o propósito dessa dica. Eu criei um plugin simples que faz exatamente isso. Sabia que se você associar um post a uma página ou uma página a outra página sai mais barato para o MySQL realizar essa consulta? A consulta Página e filhos sejam os filhos posts ou páginas, retorna mais rápido do que uma consulta com categorias, onde a associação de post e categoria envolve mais duas tabelas além da dos posts, ao contrário de uma associação do tipo M&C que envolve só a tabela dos posts. Resumindo, é mais viável associar um post a uma página e puxar por ela, do que associar a uma categoria, mas é necessário uma visão de praticidade também, às vezes, dependendo da utilização das categorias é mais prático utilizar categorias do que páginas, e outras é mais prático utilizar as próprias páginas dentro da página do que associas posts a elas. É preciso ter visão! Agora vamos a utilização do plugin…

Clique aqui para fazer o download da versão 1.0

Ao baixar, passar para o diretório “wp-contents/plugins” e ativá-lo você poderá editar ou criar um post e visualizará abaixo de tags uma caixa com o título “Associar a uma página”, é ai que você associa o post a uma página. Pronto, agora que sabe como associar, vamos ver como pegar essas associações. Abra o template de alguma página ou o arquivo de template padrão de páginas do Wordpress “page.php” e adicione entre as funções while e endwhile uma nova while com a função have_children(), ficando algo semelhante a isso:

<?php if(have_posts()) : while(have_posts()) : the_post(); ?> <h3><?php the_title(); ?></h3> <?php if(have_posts_children()) : ?> <h4>Posts relacionados:</h4> <?php while(have_posts_children()) : the_post(); ?> <p><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></p> <?php endwhile; elseif(is_paged() && get_query_var('paged') > 1) : ?> <p>Nao ha posts para esta pagina na pagina "<?php echo get_query_var('paged'); ?>".</p> <?php else : ?> Essa página não contém nenhuma associação com outros posts. <?php endif; continue_have_posts(); the_content(); ?>

Muito fácil, não?  Essa função have_posts_children() propriamente dita é um get_posts() que pega o ID da página exibida no while com have_posts() e através de um novo while lista os posts associados. A função continue_have_posts() serve para continuar a puxar as informações da página depois que você lista todos os posts relacionados a página, isso quer dizer que você pode fazer até uma paginação dentro da página com os posts relacionados e depois que colocar a função de paginação você coloca a função continue_have_posts() e continua a puxar as informações da página normalmente. Você também pode substituir a função while por foreach definindo o valor true dentro da função have_posts_children(). Assim:

<?php if(have_posts()) : while(have_posts()) : the_post(); ?> <h3><?php the_title(); ?></h3> <?php if(have_posts_children()) : ?> <h4>Posts da categoria:</h4> <?php foreach(have_posts_children(true) as $post) : setup_postdata($post); ?> <p><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></p> <?php endforeach; else : ?> Essa página não contém nenhuma associação com outros posts. <?php endif; continue_have_posts(); ?> <?php the_content(); ?> <?php endwhile; else : ?> A página que você está tentando acessar não existe. <?php endif;?>

Lembrando que na função have_posts_children() você pode usar os parâmetros de query_posts(), ou seja, a função have_posts_children() é quase como um segundo query_posts(), onde há um parâmetro padrão que justifica o relacionamento entre posts e outras páginas (ou outros posts também). Esse parâmetro é “post_parent=%” onde no lugar de “%” vai o ID da página citado em have_posts(). Para desativar, esse “post_parent” que é definido por padrão na função e usar have_posts_children() exatamente como uma segunda query, basta definir:

<?php query_posts_children('post_parent=false'); ?>

Ficando algo assim:

<?php if(have_posts()) : while(have_posts()) : the_post(); ?> <h3><?php the_title(); ?></h3> <?php> query_posts_children('post_parent=false'); if(have_posts_children()) : ?> <h4>Todos os posts do site sem precisar ter nenhum relação):</h4> <?php while(have_posts_children()) : the_post(); ?> <p><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></p> <?php endwhile; else : ?> Essa página não contém nenhuma associação com outros posts. <?php endif; continue_have_posts(); ?> <?php the_content(); ?> <?php endwhile; else : ?> A página que você está tentando acessar não existe. <?php endif;?>

É ai que entra uma outra função query_posts_children(), ela funciona mais ou menos como query_posts() sobre have_posts(). Só que essa função funciona apenas sobre have_posts_children().

Como havia dito, por padrão have_posts_children() pega os posts associados via parâmetro “post_parent”. Então se associarmos um post em uma página “X”, e associarmos este mesmo post a uma categoria “Y”, podemos puxar via have_posts_children() os posts associados com a página “X” e com a categoria “Y”, através da função query_posts_children().  Assim:

<?php query_posts_children('cat=Y'); ?>

Ou seja, se você aplicou query_posts_children() no template de página do Wordpress, a opção acima equivale a:

<?php query_posts_children('post_parent=X&cat=Y'); ?>

Digo e repito, que query_posts_children() já define por padrão o parâmetro post_parent, onde o valor é o ID da página.
Outra dica muito bacana e útil com relação a essa função e que você pode ao invés de puxar, posts relacionados, você pode puxar as páginas relacionadas, que seriam as páginas filhas da página que está aberta. Usando query_posts_children() dessa forma:

<?php query_posts_children('post_type=page'); ?>

Também temos uma outra função:

<?php dont_get_post_children(); ?>

A idéia dessa função é que mesmo que você escreva um post e associe ele a uma página, o Wordpress necessita que você associe esse post a uma categoria também, se não associarmos uma categoria, o Wordpress associa automaticamente a uma padrão. Mas enfim, a idéia dessa função é burlar isso, de modo que se você entrar na página da categoria na qual o post foi associado não exiba o mesmo se ele estiver associado com uma página também. Deu pra sacar? Se desejarem fazer isso, basta você adicionar no inicio do arquivo de template da categoria essa função, ou para um efeito melhor ainda coloque dentro do arquivo “functions.php” do seu tema. Se este arquivo não existir crie ele. Aliás, você pode copiar todo o código desse plugin e colar dentro do arquivo “functions.php” ao invés de usá-lo como um plugin, daí você estará adaptando o seu tema.

Obs(1).: Lembrando que na hierarquia das páginas você pode ter slugs repetidas, se as estas estiverem em degraus de hierarquia diferentes, ao contrário de categorias que mesmo em degraus diferentes a slug é única.
Ou seja, você pode ter as duas URLs abaixo funcionando perfeitamente se as mesmas forem páginas:
http://www.pblog.com.br/plugins/mais-populares/
http://www.pblog.com.br/temas/mais-populares/
Mas não com categorias, acho isso uma falha do Wordpress, mas por outro lado é menos consulta com o MySQL, Alías, pra arrumar isso na hierarquia das categorias não é tão díficil, porém a API do Wordpress não facilita muito para esse fim.

Não utilizei muitas linhas para escrever esse plugin, tornando-o simples, porém muito útil como havia dito anteriormente. Talvez eu dê uma nova versão pra ele, posso implementar várias coisas para melhorar a usabilidade.  Bom, essa foi a dica de hoje, eu tenho várias outras dicas interessantes e úteis como essa, porém realmente me falta tempo, mas vou arranjar. Ainda mais quando o meu site voltar ao ar. Mas enfim, espero que tenham curtido. Abraço a todos.

Obs(2).: Eu odiei o layout da versão 2.7!

Clique aqui para fazer o download da versão 1.0 do plugin.

Adicionar um comentário

13 comentários : “ Associando posts com páginas ”

  1. 1
    Gravatar
    icommercepage :

    Uma bela aula de Wordpress, sem dúvida. Acho que seu blog não está tão parado assim, pelo que tenho lido a respeito, posts demais são prejudiais, até porque como dizem, a maioria dos leitores lêem muitos blogs, ficacaria difícil acompanhar a todos.
    Abraços.

  2. 2
    Gravatar
    Carlos :

    Nossa, Ezequiel? Faz tempo ein, você era um dos poucos na comunidade WordPress que sabia lidar com PHP a fundo mesmo. Aprendi bastante coisa com você, agora consigo me virar sozinho, mas ajuda sempre é bom né?

    Muito seu tuto!

    Obs.: Você não gostou do layout da versão 2.7? Ah, eu gostei! rsrs

  3. 3
    Gravatar
    links for 2008-12-21 « sySolution :

    [...] Associando posts com páginas (tags: wordpress) [...]

  4. 4
    Gravatar
    Matheus Bonela :

    Caramba, Ezequiel! Esse post merece um Oscar! Parabéns pelo post, cara, ficou realmente MUITO profissional!

  5. 5
    Gravatar
    Fabio :

    Então digamos que você crie um site e queira separar ele por categorias, seria muito mais vantajoso ao invéz de criar um menu linkando para as categorias em questão, fazer com que este menu linkasse para páginas, estas por sua vez fariam um loop dos posts a esta associadas nao?

    Por exemplo

    Menu >> Jogos

    Seria melhor o cara clicar em JOGOS (uma página) esta por sua vez exibiria os posts relacionados, a consulta seria por página e não por categoria, daria certo isso e não seria mais interessante fazer do que o atual sistema?

  6. 6
    Gravatar
    Ezequiel :

    Fabio, veja bem, relacionar um post com categorias é uma forma bem mais completa do que relacionar com uma página. Isto, porque a estrutura do banco de dados lhe permite ralacionar o post a mais de uma categoria. Diferente de página que lhe permite relacionar apenas uma. Eu poderia criar uma nova tabela para relacionar mais de uma, isso resolveria o problema. Porém, como havia dito no artigo, você tem que saber identificar qual a melhor forma de relacionar o post levando em conta a estrutura do site que esta sendo montado. Relacionar com páginas pode ser bem mais útil por exemplo para um site de jogos.
    Fazer uma estrutura assim:

    Categorias:
    - PC
    - PS2
    - XBOX

    Páginas:
    - UBiSOFT
        - Prince of Persia: The Sands of Time

    Posts:
    - Prince of Persia adicionado a plataforma PC (relacionado a pagina “prince of persia” e a categoria “PC”)

    Assim, usando categorias apenas como um filtro. Entendeu?
    Espero que tenha entendido. Abraço.

  7. 7
    Gravatar
    Fabio :

    Exatamente, eu tava tendo problemas porque o jeito que eu utilizava para qualificar meus posts era somente com as categorias,e para filtros mais extensos as TAGS (por exemplo, na categoria GAMES colocava tags como PS3, XBOX360, PC GAMES..)

    So que isso acaba sendo um problema, por exemplo o meu site (bemcapaz.net) eu pretendo dar noticias relacionadas a entretenimento e para isso fiz umas 6 subpaginas para as categorias (Games, cinema e Tecnologia por exemplo), e eu fazia cada página exibir a categoria relacionada ( games exibiria somente games) o que limitava eu poder especificar cada post a somente uma categoria.

    Usando o esquema das páginas vou poder fazer uma página com Games e que exibirá por exemplo as categorias, Games, Industria de Jogos, XBOX, PS3… ou seja poderei ser bem mais especifico sem caotizar , e como voce falou inclusive o banco de dados vai ficar com um acesso mais rápido.

  8. 8
    Gravatar
    Fabio :

    Apenas reiterando meu post anterior, acabei repensando na idéia já que o Wordpress é todo implementado para o uso de categorias, trocar pelas páginas provavelmente poderia resultar em muita dor de cabeça futura.

    Então o que fiz basicamente foi deixar algumas categorias estáticas para o site e para subdividir estou usando as Tags.
    Por exemplo
    Categoria : games
    tags: xbox, nintendo, pc games, web games.

  9. 9
    Gravatar
    max :

    estou tendo um probleminha:

    não hora de associar o post com a pagina não são apresentadas todas as pagina disponíveis. pq será?
    estou usando uma hierarquia de três nível na paginas e wp 2.6.5.
    minha situação é bem parecido com com a do exemplo. no caso de funcionários tem tipos de funcionários. ai queria criar posts para cada funcionário e relacionar com a pagina tipo dele.

  10. 10
    Gravatar
    João Amado :

    Oi! Adorei este tutorial! :)

    Como é que eu faço para associar uma página a outra página? Este plugin apenas aparece no editor de posts e não no de páginas…

  11. 11
    Gravatar
    alex :

    Olá Ezequiel,

    Sou iniciante em PHP e Wordpress também e não consegui entender direito como é feita a customização das páginas “page.php” para que o seu plugin funcione.
    Você poderia me enviar mais explicações, por favor?

  12. 12
    Gravatar
    Fábio Campos :

    Ola

    Exelente esse seu plugin.

    Mas por inabilidade minha não estou conseguindo inserir a linha de código na página relacionada (ex. page).

    Por gentileza, poderia contar com a sua ajuda para resolver essa questão?

    Fico no aguardo e parabéns pelo ótimo trabalho.

  13. 13
    Gravatar
    Gustavo Falcade :

    Olá Ezequiel, parabéns pelo artigo. Excelente !! Eu consegui fazer perfeitamente. Gostaria de saber também se é possível publicar um post e ele sair apenas na página que eu especificar, pois ele está publicando na home tambem. Como faço para tirar o post da home e deixá-lo apena na página específica que eu determinei ao publicar o post ?

    Obrigado desde já !!! Se preferir me mande um e-mail para explicar.

    Thanks !!!

Escreva um Comentário