Après avoir ajouté le plugin wp-custom-menu-filter - pour masquer certains éléments de menu destinés aux utilisateurs non connectés, la classe current_page_item a disparu de mon menu. $item->classes
dans le lecteur est un tableau vide, au lieu de page-item-$id
, current_page_item
habituel.
J'ai regardé la source, mais cela ne modifie pas le tableau de classes, donc je ne sais pas ce qui se passe. Voici la partie pertinente du code.
function wps_custom_nav_menu_items( $args ){
global $wpcmfp_settings;
$nav_item_db_id = $args[1]->ID;
$nav_menu = wp_get_object_terms( $nav_item_db_id, 'nav_menu' );
$menu_id = $nav_menu[0]->term_id;
// Get the class to exclude
if ( !is_user_logged_in() ) {
$exclusion_class = $wpcmfp_settings[ 'menu-' . $menu_id . '-loggedout' ];
}
else {
$exclusion_class = $wpcmfp_settings[ 'menu-' . $menu_id . '-loggedin' ];
}
$nav_items = wp_get_nav_menu_items( $menu_id );
// Cycle through all nav_items
foreach ( $nav_items as $nav_item ) {
// Cycle through all classes
for ( $i=0; $i < count( $nav_item->classes ); $i++ ) {
$exclude = false;
// if nothing is there set to add
if ( strlen ( $nav_item->classes[ $i ] ) < 1 ) {
$exclude = false;
}
else
{
// if matches add to exclusion array & break loop
if ( $nav_item->classes[ $i ] == $exclusion_class ) {
$excluded_nav_items[] = $nav_item;
$exclude = true;
break;
}
}
}
if ( $exclude != true )
$modified_nav_items[] = $nav_item;
}
return $modified_nav_items;
}
add_filter( 'wp_nav_menu_objects', 'wps_custom_nav_menu_items' , 10 , 3);
J'utilise un navigateur de page personnalisé, j'ai essayé d'utiliser celui par défaut sans effet, et le logiciel personnalisé fonctionne très bien sans ce plugin. Voici le code du promeneur:
class My_Walker_Page extends Walker_Nav_Menu {
protected $_counter = 0;
protected $_itemsPerColumn = 1;
function start_lvl(&$output, $depth) {
$this->_counter = 0;
$output .= '<some html>';
}
function end_lvl(&$output, $depth) {
$output .= '<some html>';
$this->_counter = 0;
}
function start_el(&$output, $page, $depth, $args, $current_page = null) {
$args = ( array ) $args;
if ($depth == 0) {
return parent::start_el ( $output, $page, $depth, $args, $current_page );
}
if ($depth == 1) {
extract ( $args, EXTR_SKIP );
$output .= '<dt><a href="' . esc_attr ( $page->url ) . '" title="' . esc_attr ( wp_strip_all_tags ( apply_filters ( 'the_title', $page->title, $page->ID ) ) ) . '">' . $link_before . apply_filters ( 'the_title', $page->title, $page->ID ) . $link_after . '</a>';
if (! empty ( $page->description )) {
$output .= '<span class="menu_item_description">' . $page->description . '</span>';
}
$output .= '</dt>';
$this->_counter ++;
if ($this->_counter % $this->_itemsPerColumn == 0) {
$output .= '</dl><dl>';
}
}
}
function end_el(&$output, $page, $depth) {
if ($depth == 0) {
return parent::end_el ( &$output, $page, $depth );
}
}
function display_element($element, &$children_elements, $max_depth, $depth = 0, $args, &$output) {
if (! $element)
return;
$id_field = $this->db_fields ['id'];
if ($depth == 0) {
$this->_itemsPerColumn = ceil ( count ( $children_elements [$element->$id_field] ) / 4 );
}
return parent::display_element ( $element, $children_elements, $max_depth, $depth, $args, $output );
}
}
Je suis d'accord avec un autre moyen de masquer les éléments de menu pour les utilisateurs non connectés, au lieu de réparer le plugin, mais comme je n'ai jamais utilisé le wp_nav_menu_objects
, je ne sais vraiment pas ce qui se passe.
Après quelques heures de débogage, j'ai découvert que wps_custom_nav_menu_items () recevait réellement nav_menu_items avec des classes, appliquées par _wp_menu_item_classes_by_context, mais au lieu de les utiliser, le menu entier de la base de données était rechargé! Donc si tu changes
$nav_items = wp_get_nav_menu_items( $menu_id );
À
$nav_items = $args;
(ou simplement supprimer la ligne et renommer l'argument de la fonction), cela fonctionne comme prévu.