Vincular dinámicamente a la última publicación o simular una solicitud de publicación específica en la plantilla de página

4

Quiero tener un enlace en el menú de WordPress que apunte a la última publicación de una categoría específica.

Como no puedo poner una URL dinámica en el menú de wordpress, mi enfoque fue colocar una página con una plantilla de página personalizada en el menú.

Esta plantilla de página debe comportarse como los temas single.php pero mostrando la última publicación de la categoría dada.

¿Hay alguna forma de incluir los temas single.php y simular una solicitud de una publicación específica?

Intenté copiar el contenido de single.php en una plantilla de página y modificar la consulta con

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

Si hago eso antes de the_header() , no obtendré ninguna publicación. Si lo hago después de the_header() , obtengo el contenido correcto, pero el encabezado del tema establecerá algunas clases específicas para el estilo de una página. Así que necesito la función the_header() para pensar que se solicitó la publicación deseada y no la página.

Actualización: No utilicé completamente la solución por toscho porque no pude resaltar la entrada del menú activo y en la posición correcta con eso. Pero me señaló en la dirección correcta con el filtro wp_nav_menu_objects .

Tenía un elemento del menú principal CategoryX que debería abrir directamente la última publicación de CategoryX , y también abrir un submenú con enlaces a publicaciones más antiguas y otras relacionadas cosas. El submenú también debe tener un enlace a la última publicación ( LatestFromX ), que también debe resaltarse directamente después de hacer clic en CategoryX en el menú principal.

Lo que básicamente hice fue: crear elementos de menú ficticios con el backend de administración de WP y luego reemplazar su URL con la función 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;
}
    
pregunta Pascal Rosin 27.07.2012 - 16:02

2 respuestas

5

Puedes filtrar wp_nav_menu_objects y agregar un nuevo elemento. Aquí hay un simple complemento que hace eso:

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

Si escribimos una nueva entrada ...

...yllamaalmenúdenavegacióncomoeste...

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

...obtenemos...

El elemento del menú de navegación tiene una clase latest-post , por lo que podemos personalizarlo por CSS:

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

O usa este plugin. No se requiere codificación de wp_nav_menu:

enlace

enlace

    
respondido por el mahal tertin 10.08.2017 - 15:33

Lea otras preguntas en las etiquetas