Vincule dinamicamente à postagem mais recente ou simule a solicitação de uma postagem específica no modelo de página

4

Eu quero ter um link no menu do wordpress apontando para a última postagem de uma categoria específica.

Como não posso colocar um URL dinâmico no menu do wordpress, minha abordagem foi colocar uma página com um modelo de página personalizado no menu.

Este modelo de página deve se comportar como os temas single.php , mas mostrando a última postagem da categoria em questão.

Existe uma maneira de incluir os temas single.php e simular uma solicitação de uma postagem específica?

Eu tentei copiar o conteúdo de single.php em um modelo de página e modificar a consulta com

query_posts( array( 'cat' => 9993, 'showposts' => 1) );

Se eu fizer isso antes de the_header() , não receberei posts. Se eu fizer isso depois de the_header() , obtenho o conteúdo correto, mas o cabeçalho do tema definirá algumas classes específicas para estilizar uma página. Então eu preciso da função the_header() para pensar que a postagem desejada foi solicitada e não a página.

Atualização: Eu não usei completamente a solução por toscho porque eu não consegui destacar a entrada do menu ativo e na posição certa com isso. Mas ele me apontou na direção certa com o filtro wp_nav_menu_objects .

Eu tinha um item de menu principal CategoryX que deveria abrir diretamente a última postagem de CategoryX e também abrir um submenu com links para postagens mais antigas e outras relacionadas coisas. O sub-menu deve ter também um link para o último Post ( LatestFromX ), que também deve ser destacado diretamente após clicar em CategoryX no menu principal.

O que basicamente fiz foi: criar itens de menu fictícios com o backend de administração do WP e depois substituir sua URL pela função de filtro.

function wp_menu_add_last_from_category_x( $sorted_menu_items, $args ) {   
    global $wp;

    // get url of latest article in CategoryX (CategoryX has id 9993):
    $latest = get_posts( array( 'numberposts' => 1, 'category' => 9993 ) ); 
    $latest_url = get_permalink($latest[0]->ID);

    // search for the dummy menu items and replace the url:
    foreach ($sorted_menu_items as $key => $item) {
        if ($item->title === 'CategoryX' || $item->title === 'LatestFromX') {
            $sorted_menu_items[$key]->url = $latest_url;
            if ($wp->request == $latest[0]->post_name) {
                $sorted_menu_items[$key]->classes[] = "current-menu-item";
            }
        }
    }

    return $sorted_menu_items;
}
    
por Pascal Rosin 27.07.2012 / 16:02

2 respostas

5

Você pode filtrar wp_nav_menu_objects e adicionar um novo item. Aqui está um plugin simples fazendo isso:

<?php # -*- coding: utf-8 -*-
/**
 * Plugin Name: Latest Post In Menu
 * Description: Append a link to the latest post to all nav menus called with the argument <code>'add_latest_post' => TRUE</code>.
 * Plugin URI:  http://wordpress.stackexchange.com/q/59892/73
 * Version:     2012.07
 * Author:      Thomas Scholz
 * Author URI:  http://toscho.de
 * License:     MIT
 * License URI: http://www.opensource.org/licenses/mit-license.php
 */

add_filter( 'wp_nav_menu_objects', 'wpse_59892_latest_post_in_nav_menu', 10, 2 );

/**
 * Add a link to the latest post to the nav menu.
 *
 * The nav menu has to be called with 'add_latest_post' => TRUE.
 * Example:
 * wp_nav_menu(
 *  array(
 *      'theme_location' => 'primary',
 *      'add_latest_post' => TRUE
 *  )
 * );
 *
 * @wp-hook wp_nav_menu_objects
 * @param   array $sorted_menu_items Existing menu items
 * @param   object $args Nav menu arguments as object.
 * @return  array
 */
function wpse_59892_latest_post_in_nav_menu( $sorted_menu_items, $args )
{
    if ( ! isset ( $args->add_latest_post )                    // argument set?
        or ! $args->add_latest_post                           // argument TRUE?
        or ! $latest = get_posts( array ( 'numberposts' => 1 ) ) // post found?
    )
    {
        return $sorted_menu_items;
    }

    // Uncomment the following line to see what you can change:
    // print '<pre>' . htmlspecialchars( var_export( $sorted_menu_items, TRUE ) ) . '</pre>';

    $post    = $latest[0];
    $content = empty ( $post->post_excerpt ) ? $post->post_content : $post->post_excerpt;
    $link    = array (
        'title'            => $post->post_title,
        'menu_item_parent' => 0,
        'ID'               => '',
        'db_id'            => '',
        'url'              => get_permalink( $post->ID ),
        'classes'          => array (
                0 => '',
                1 => 'menu-item',
                2 => 'menu-item-type-post_type',
                3 => 'menu-item-object-post',
                4 => 'latest-post',
            ),
        // strips all tags and reduces the length to 20 words
        'attr_title'       => wp_trim_words( $content, 20 ),
    );

    $sorted_menu_items[] = (object) $link;

    return $sorted_menu_items;
}

Se escrevermos um novo post…

…eligueparaomenudenavegaçãoassim…

wp_nav_menu(array('theme_location'=>'primary','add_latest_post'=>TRUE));

…nóstemos…

O item de menu nav tem uma classe latest-post , então podemos estilizá-lo por CSS:

.menu .latest-post a
{
    color: #eee;
    background: #9f0;
}
    
por fuxia 27.07.2012 / 19:23
0

Ou use este plugin. Nenhuma codificação de wp_nav_menu necessária:

enlace

enlace

    
por mahal tertin 10.08.2017 / 15:33