8721 sujets

Développement web côté serveur, CMS

Bonjour,

Je souhaite afficher un 'span.active' sur un onglet si la page en cours fait partie d'une page de catégorie et si la catégorie est la bonne, un lien dans le cas contraire :
			if ( $testLink ) {
				$menuList .= '<span class="active">';
			} else {
				$menuList .= '<a href="' . $url . '">';
			}


Je n'ai pas de problème pour tester mes articles, le problème est avec les catégories. Par exemple ici, si je clique sur l'onglet "La rédaction", j'aimerais que cet onglet prenne un état actif quand j'arrive à la page de destination "Catégorie : La rédaction".

Le code pour tester la condition en son état actuel :
			$testLink = (
				( is_singular() AND ( $url === get_permalink() ) )
				OR
				( is_category() AND ( $url === get_category_link( is_category() ) ) )
				);

La première partie, servant à tester le lien d'un article, fonctionne, c'est la deuxième partie qui me pose problème...
Modifié par Olivier C (01 Dec 2018 - 13:17)
En relisant mon post je me demande si j'ai été assez clair : je cherche à récupérer un booléen sur un item de mon menu quand je suis sur une page de catégorie donnée. Voilà...
Modérateur
Bonjour Olivier,

Difficile ta question car nous ne savons comment sont générées tes pages, quel est le contexte... J'ai imaginé ce bout de code en partant sur des hypothèses qui je l'espère ne seront pas trop éloignées de ta réalité.

$_categories=array(
 'cat01'=>array(
    'page1.php',
    'page2.php',
    'page3.php'
    ),
 'cat02'=>array(
    'page8.php',
    'page9.php',
    'page10.php'
    )
);
/* Ici on a défini quel ensemble de pages correspond à chaque catégorie */

if(in_array(pathinfo($_SERVER['PHP_SELF'], PATHINFO_BASENAME), $_categories['cat01']) {
echo 'La page en cours correspond à la catégorie: ',$_categories['cat01'];
$menulist.='<span class="active">...';
}
/* l'idée ici est de tester l'appartenance à une catégorie de la page en cours*/
else{
 echo 'La page en cours est hors catégorie';
 $menulist.='<a>...';
}

C'est succin je te l'accorde. Le test d’appartenance doit bien sûr être intégré dans une boucle pour tester chaque catégorie.

Je suis partis d'un tableau qui contient les catégories et leurs pages d'appartenance. Bien sûr, on peut imaginer un emplacement en Bdd ou encore un couple clé-valeur en bdd ajouté à la table des liens.

L'idée c'est de définir l'appartenance des pages en amont donc lier catégorie et groupe de pages puis de tester la page en cours afin d'apposer la classe active à l'endroit approprié.



Est-ce que cela te paraît clair ? Sinon je répète.



N.B.: A relire le sujet, je ne suis pas certain de ne pas avoir fait un contre-sens. Toutefois je laisse cette réponse qui sera soit une piste à suivre ou à écarter.
Je pense que le plus simple serait d'avoir un visu sur la partie du code concernée dans sa version brute (avec les interactions php).
Modifié par Greg_Lumiere (24 May 2016 - 17:46)
Hello,

Dans ton test, il me semble que le problème c'est que is_category() renvoie un booléen, et que tu ne peux donc pas l'utiliser pour obtenir quoique ce soit d'intéressant avec get_category_link() Smiley cligne

Question : avec quoi liste-tu tes catégories à la base ?
Bon c'est pas exactement ce que tu cherche (edit : mais en fait je crois que si du coup !), mais jette un œil au snippet ci-après, directement récupéré d'un truc en cours. Désolé y a pas mal de trucs qui te seront inutiles (et le code n'est pas très très joli ^^), mais cherche le commentaire "ICI" que j'ai ajouté : single_term_title() (pour toi single_cat_title()) devrait faire le job Smiley smile


$args = array( 'hide_empty' => 1 );
$terms = get_terms( 'actualites-rubrique', $args );
if ( ! empty( $terms ) && ! is_wp_error( $terms ) ) {
    $term_list = '<select id="rubrique-select" name="rubrique-select">';
    $term_list .= '<option value="'.get_bloginfo('url').'/toutes-les-actualites/" selected>Toutes</option>';
    foreach ( $terms as $term ) {
    	if (single_term_title('', false) == $term->name) { // ICI
    		$term_list .= '<option value="'.get_term_link( $term ).'" selected>' . $term->name . '</option>';
        } else {
    		$term_list .= '<option value="'.get_term_link( $term ).'">' . $term->name . '</option>';
	}
    }
    $term_list .= '</select>';
}				

Modifié par audrasjb (24 May 2016 - 23:04)
Merci Greg_Lumiere. Mais mon script était effectivement très différent. Je le mettrais sur Github un de ces 4, mais comme ce dernier gère mal les changements de nom de fichiers uppercase/lovercase, je vais attendre un peu...

En attendant j'ai trouvé la solution, mais WordPress m'a saoulé sur ce coup, j'ai donc adopté une solution de contournement :
$uri = '//' .$_SERVER[ 'HTTP_HOST' ] . $_SERVER[ 'REQUEST_URI' ]; // Alternative à get_permalink() qui ne fonctionne pas dans toutes les situations. Dans la vraie vie cette variable est globale.

$arrayHttp = [ 'http://', 'https://' ]; // Ici c'est pas très beau, c'est pour préparer le str_replace qui va suivre...
$testLink = ( $tabUri == $uri );
foreach ( ( array ) $menu_items as $key => $menu_item ) {
			$title = $menu_item->title;
			$tabUri = $menu_item->url; // On récupère l'url de l'onglet
			$tabUri = str_replace( $arrayHttp, '//', $tabUri ); // Traitement permettant une comparaison avec la variable $uri. Si vous avez une solution permettant de traiter les HyperText Transfer Protocol d'une manière plus élégante, je suis preneur...
			// La suite du foreach...
}
Modérateur
Bien content si tu as pus solutionner ton problème.

Ce matin j'y repensais en plus, en effet je n'avais pas prêté attention au fait que c'était sous Wordpress. Ce qui me faisait penser au fait que j'aurais mieux fait de ne rien dire, je ne connais pas la mécanique Wp.

Et comme qui dirait "le code entre Wordpress et moi, sa passe pas" Smiley cligne :-P
Oui. C'est à dire que là, je devais coder la structure d'un menu sans items prédéfinis à l'avance puisque le menu doit être entièrement personnalisable par l'admin du site. Autrefois j'utilisais un système de champ personnalisés, titre + liens, à remplir côté admin, là j'ai voulu m'essayer au système natif de WordPress qui permet de faire de simples menu par glisser/déposer.

Forcément ça ne simplifie pas la tâche, mais une fois que c'est fait c'est cool.
Hello,

me a écrit :
Question : avec quoi liste-tu tes catégories à la base ?

Sympa d'avoir répondu, à ça comme au reste de mes messages… Smiley rolleyes

OlivierC a écrit :
là j'ai voulu m'essayer au système natif de WordPress qui permet de faire de simples menu par glisser/déposer

Du coup tu utilise wp_nav_menu() ou un walker issu de cette fonction ? parce que dans ce cas je ne comprend pas pourquoi tu utilise le code de ton dernier message. Il y a amha moyen de faire moins compliqué
Modifié par audrasjb (25 May 2016 - 11:23)
audrasjb a écrit :
Sympa d'avoir répondu, à ça comme au reste de mes messages…

Pardon, désolé, je n'ai effectivement pas répondu à tout le monde ce matin car j'étais à cours de temps, je ne me suis concentré que sur le premier interlocuteur...

audrasjb a écrit :
Du coup tu utilise wp_nav_menu() ou un walker issu de cette fonction ?

Ni l'un ni l'autre : j'utilise wp_get_nav_menu_items().

audrasjb a écrit :
... parce que dans ce cas je ne comprend pas pourquoi tu utilise le code de ton dernier message. Il y a moyen de faire moins compliqué.

Oh que oui très certainement, mais le code produit fonctionne dans tous les cas de figure, même pour les cas que je n'ai pas encore prévu (les archives par exemple), alors bon...