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;
}
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…
… Et appelez le menu de navigation comme ceci…
wp_nav_menu(
array(
'theme_location' => 'primary',
'add_latest_post' => TRUE
)
);
… on a …
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;
}
Ou utilisez ce plugin. Aucun codage de wp_nav_menu requis:
https://de.wordpress.org/plugins/dynamic-latest-post-in-nav-menu/
https://github.com/hijiriworld/dynamic-latest-post-in-nav-menu