web-dev-qa-db-fra.com

Créer un lien dynamique vers le dernier message ou simuler la demande d'un message spécifique dans le modèle de page

Je veux avoir un lien dans le menu wordpress pointant sur le dernier message d'une catégorie spécifique.

Parce que je ne peux pas mettre une URL dynamique dans le menu wordpress, mon approche a été de mettre une page avec un modèle de page personnalisé dans le menu.

Ce modèle de page doit se comporter comme les thèmes single.php, mais en affichant le dernier message de la catégorie donnée.

Existe-t-il un moyen d'inclure les thèmes single.php et de simuler une demande d'un message spécifique?

J'ai essayé de copier le contenu de single.php dans un modèle de page et de modifier la requête avec

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

Si je le fais avant the_header(), je n’aurai aucun message. Si je le fais après the_header(), le contenu est correct mais l'en-tête du thème définira des classes spécifiques pour le style d'une page. J'ai donc besoin de la fonction the_header() pour penser que le message souhaité a été demandé et non la page.

Mise à jour: Je n'ai pas utilisé complètement la solution de toscho car l'entrée de menu active n'a pas été mise en surbrillance et dans la bonne position. Mais il m'a dirigé dans la bonne direction avec le filtre wp_nav_menu_objects.

J'ai eu un élément de menu principal CategoryX qui devrait ouvrir directement le dernier message de CategoryX , et également ouvrir un sous-menu avec des liens vers des messages plus anciens et d'autres choses connexes. Le sous-menu devrait également contenir un lien vers le dernier message ( LatestFromX ), qui devrait également être mis en évidence directement après avoir cliqué sur CategoryX dans le menu principal.

Ce que j’ai fait en gros, c’est: créer des éléments de menu factices avec le backend WP admin, puis remplacer son URL par la fonction de filtrage.

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;
}
4
Pascal Rosin

Vous pouvez filtrer wp_nav_menu_objects et ajouter un nouvel élément. Voici un plugin simple faisant cela:

<?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 nous écrivons un nouveau post…

enter image description here

… Et appelez le menu de navigation comme ceci…

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

… on a …

enter image description here

L'élément de menu de navigation a une classe latest-post, nous pouvons donc la nommer par CSS:

.menu .latest-post a
{
    color: #eee;
    background: #9f0;
}
5
fuxia
0
mahal tertin