Je recherche un plug-in personnalisé, permalien, capable d'interagir avec les classes de menus.
Par exemple, j'ai un menu qui inclut le parent website.com/shop
parmi ses éléments de liste. Si une page, par exemple website.com/shop/product
, inclut ce menu, l'élément de liste pour website.com/shop
aura une classe, quelque chose comme current-page-ancestor
. Ceci est utile pour styliser ce lien afin que les utilisateurs sachent dans quelle section du site ils se trouvent.
Mais j'aurai des pages dont le parent ne sera pas website.com/shop
(une fonctionnalité que je ne peux pas modifier), mais je veux qu'il apparaisse que website.com/shop
est le parent. Par exemple, la page est website.com/foo/product-2
. J'utilise actuellement le plugin Custom Permalinks pour changer le permalien en website.com/shop/product-2
. Ce faisant, le menu ne reconnaît pas que website.com/shop
est le parent et aucune classe n'est ajoutée à l'élément de liste du menu.
Existe-t-il une solution de contournement pour cela, ou connaissez-vous un plugin personnalisé de permaliens qui prendrait en charge l'ascendance de menu?
Modifier
Je sens que je suis juste là, mais manque une chose ...
function getUrl() {
$url = @( $_SERVER["HTTPS"] != 'on' ) ? 'http://'.$_SERVER["SERVER_NAME"] : 'https://'.$_SERVER["SERVER_NAME"];
$url .= ( $_SERVER["SERVER_PORT"] !== 80 ) ? ":".$_SERVER["SERVER_PORT"] : "";
$url .= $_SERVER["REQUEST_URI"];
return $url;
}
function getDir($foo) {
$url = $foo;
$info = parse_url($url);
$dir = dirname($info["path"]);
return $dir;
}
function wpa83498_nav_class( $classes, $item ){
// if Shop is the current menu item being output
// and we're viewing a single product post type
$currentDirPath = getDir(getUrl());
if( ('Sales' == $item->title && is_singular( 'product' )) || (parse_url($item->url, PHP_URL_PATH) == $currentDirPath && is_singular( 'product' )) )
$classes[] = 'current-page-ancestor';
return $classes;
}
add_filter( 'nav_menu_css_class', 'wpa83498_nav_class', 10, 2 );
Voici la solution finale que j'ai trouvée. J'ai passé beaucoup de temps à chercher si je pouvais changer le type de message personnalisé "product" en hiérarchique et définir correctement le parent de la page afin que les menus ajoutent naturellement les bonnes classes d'ancêtres. Mais je suis tombé sur un barrage routier pour finalement revenir à une solution basée sur le nouveau permalien.
Donc, j'imagine que cela devrait fonctionner pour toute personne qui cherche à simuler une hiérarchie de pages parentes lors de l'utilisation de permaliens personnalisés.
Nous obtenons l'URL de la page en cours (définie par le plugin permalinks personnalisé), puis la supprimons du chemin et l'enregistrons sous la variable $currentDirPath
. Ensuite, nous évaluons si le chemin d'accès à un élément de menu est contenu dans le $currentDirPath
et, le cas échéant, nous ajoutons la classe current-page-ancestor
.
function getUrl() {
$url = @( $_SERVER["HTTPS"] != 'on' ) ? 'http://'.$_SERVER["SERVER_NAME"] : 'https://'.$_SERVER["SERVER_NAME"];
$url .= ( $_SERVER["SERVER_PORT"] !== 80 ) ? ":".$_SERVER["SERVER_PORT"] : "";
$url .= $_SERVER["REQUEST_URI"];
return $url;
}
function getDir($foo) {
$url = $foo;
$info = parse_url($url);
$dir = dirname($info["path"]);
return $dir;
}
function wpa83498_nav_class( $classes, $item ){
$currentDirPath = getDir(getUrl());
if( (strpos($currentDirPath,(parse_url($item->url, PHP_URL_PATH))) !== false) && is_singular( 'product' ) )
$classes[] = 'current-page-ancestor';
return $classes;
}
add_filter( 'nav_menu_css_class', 'wpa83498_nav_class', 10, 2 );
Vous pouvez ajouter des classes à wp_nav_menu
via le filtre nav_menu_css_class :
function wpa83498_nav_class( $classes, $item ){
// if Shop is the current menu item being output
// and we're viewing a single product post type
if( 'Shop' == $item->title && is_singular( 'product' ) )
$classes[] = 'current-page-ancestor';
return $classes;
}
add_filter( 'nav_menu_css_class', 'wpa83498_nav_class', 10, 2 );
EDIT -
Essayez ceci pour voir comment les objets qui composent un menu sont construits. Peut-être que cela vous éclairera sur la manière dont vous pouvez manipuler la sortie du menu. Examinez des éléments tels que menu_item_parent
et object_id
pour voir comment les éléments de menu sont liés les uns aux autres et les publications/pages qu’ils représentent. Attention, ne faites pas ceci sur un site live!
function wpa_inspect_menu_objects( $menu ) {
echo '<pre>';
print_r( $menu );
echo '</pre>';
die();
}
add_filter( 'wp_nav_menu_objects' , 'wpa_inspect_menu_objects' );