Les titres de navigation BuddyPress
Les titres de navigation de l’espace BuddyPress ne peuvent pas être modifiés simplement en utilisant le tableau de bord WordPress. Cet article montre donc comment y parvenir de manière programmatique.
Par exemple, dans la section Activités
, je veux modifier le sous-titre Mes citations
en Mentions
.
Avant :
Après :
Je vous montre dans cet article deux façons d’y parvenir :
- Utiliser un hook BuddyPress
- Interagir avec l’API BuddyPress
Utiliser un hook BuddyPress
Le moyen le plus direct est d’utiliser le filtre bp_nouveau_get_nav_link_text
qui prend trois paramètres :
$link_text
: Le texte HTML de l’élément de menu$nav_item
: L’élément de menu courant$displayed_nav
: La navigation courante/li>
Le contenu de ces paramètres pour le sous-menu Mes citations
:
$link_text: Mes citations
$nav_item: BP_Core_Nav_Item Object
(
[storage:ArrayObject:private] => Array
(
[name] => Mes citations
[link] => http://wordpress-blog.loc/membres/ludovic/activity/mentions/
[slug] => mentions
[parent_slug] => activity
[css_id] => activity-mentions
[position] => 20
[user_has_access] => 1
[no_access_url] =>
[screen_function] => bp_activity_screen_mentions
[show_in_admin_bar] =>
[secondary] => 1
)
)
$displayed_nav: personal
Le code :
/**
* WP BuddyPress management
*
* @since 1.0.0
*/
class Sukellos_BuddyPress_Manager {
/**
* Constructor
*/
public function __construct() {
add_filter( 'bp_nouveau_get_nav_link_text', array( $this, 'filter_bp_nouveau_get_nav_link_text' ), 10, 3 );
}
/**
* Filter to edit the html text of the nav.
*
* @since 3.0.0
*
* @param string $link_text The html text of the nav item.
* @param object $nav_item The current nav item object.
* @param string $value The current nav in use (eg: 'directory', 'groups', 'personal', etc..).
*/
public function filter_bp_nouveau_get_nav_link_text( $link_text, $nav_item, $displayed_nav ) {
if ( $nav_item->slug === 'mentions' ) {
$link_text = 'Mentions';
}
return $link_text;
}
}
new Sukellos_BuddyPress_Manager();
Il faut modifier la valeur retournée lorsque ce filtre est appelé pour le sous-menu dont le slug est mentions
De fait la question suivante se pose :
- Comment connaître les slugs du sous-menu ?
- De manière plus précise, comment savoir que c’est le slug
mentions
que je dois surveiller ?
La réponse n’est pas très simple et j’en parle dans d’autres articles sur BuddyPress. Il existe une fonction qui donne un aperçu de l’arborescence complète du menu en cours d’affichage : get_item_nav()
.
- Première difficulté : elle est définie dans la classe
BP_Core_Nav
. Il est donc nécessaire de récupérer l’instance de cette classe lors de l’exécution. - Ensuite, elle doit être appelée une fois que la construction du menu de navigation est complète… ce qui malheureusement n’est pas le cas lors de l’appel du filtre
bp_nouveau_get_nav_link_text
.
La solution est de l’appeler juste avant l’affichage du menu, lors de l’appel de l’action bp_actions
:
/**
* WP BuddyPress management
*
* @since 1.0.0
*/
class Sukellos_BuddyPress_Manager {
/**
* Constructor
*/
public function __construct() {
add_action( 'bp_actions', array( $this, 'action_bp_actions' ), 10 );
}
/**
* Fires inside the 'bp_actions' function, which runs just before rendering.
*
* @since 1.5.0
*/
public function action_bp_actions() {
// BP_Core_Nav
$bp_core_nav = buddypress()->members->nav;
// Get nav items
$get_item_nav = $bp_core_nav->get_item_nav();
error_log( __METHOD__.' - $get_item_nav : '.print_r( $get_item_nav, true ) );
}
}
new Sukellos_BuddyPress_Manager();
Et voici un aperçu de ce que cela donne :
[20] => BP_Core_Nav_Item Object
(
[storage:ArrayObject:private] => Array
(
[name] => Mes citations
[link] => http://wordpress-blog.loc/membres/ludovic/activity/mentions/
[slug] => mentions
[parent_slug] => activity
[css_id] => activity-mentions
[position] => 20
[user_has_access] => 1
[no_access_url] =>
[screen_function] => bp_activity_screen_mentions
[show_in_admin_bar] =>
[secondary] => 1
)
)
L’instance de BP_Core_Nav
peut être accédée de cette manière : buddypress()->members->nav;
Cela constitue une transition parfaite pour introduire la deuxième façon de modifier le titre du sous-menu. Effectivement, quitte à utiliser cette action bp_actions
, on peut en profiter pour interagir directement avec les fonctions du coeur de BuddyPress.
Interagir avec l’API BuddyPress
Le hook bp_actions
est appelé immédiatement avant l’affichage du menu. C’est donc l’endroit idéal pour modifier ce dernier.
La fonction edit_nav
peut être utilisée. Elle prend 3 paramètres :
$args
: Les paramètres à modifier dans la navigation.$slug
: Slug de la navigation$parent_slug
: Slug de la navigation parente
/**
* WP BuddyPress management
*
* @since 1.0.0
*/
class Sukellos_BuddyPress_Manager {
/**
* Constructor
*/
public function __construct() {
add_action( 'bp_actions', array( $this, 'action_bp_actions' ), 10 );
}
/**
* Fires inside the 'bp_actions' function, which runs just before rendering.
*
* @since 1.5.0
*/
public function action_bp_actions() {
// BP_Core_Nav
$bp_core_nav = buddypress()->members->nav;
$bp_core_nav->edit_nav(
array(
'name' => 'Mentions',
'slug' => 'mentions',
), 'mentions', 'activity' );
}
}
new Sukellos_BuddyPress_Manager();
Le code intégral
Le code intégral comprenant les deux approches :
/**
* WP BuddyPress management
*
* @since 1.0.0
*/
class Sukellos_BuddyPress_Manager {
/**
* Constructor
*/
public function __construct() {
add_filter( 'bp_nouveau_get_nav_link_text', array( $this, 'filter_bp_nouveau_get_nav_link_text' ), 10, 3 );
add_action( 'bp_actions', array( $this, 'action_bp_actions' ), 10 );
}
/**
* Fires inside the 'bp_actions' function, which runs just before rendering.
*
* @since 1.5.0
*/
public function action_bp_actions() {
// BP_Core_Nav
$bp_core_nav = buddypress()->members->nav;
$bp_core_nav->edit_nav(
array(
'name' => 'Mentions',
'slug' => 'mentions',
), 'mentions', 'activity' );
}
/**
* Filter to edit the html text of the nav.
*
* @since 3.0.0
*
* @param string $link_text The html text of the nav item.
* @param object $nav_item The current nav item object.
* @param string $value The current nav in use (eg: 'directory', 'groups', 'personal', etc..).
*/
public function filter_bp_nouveau_get_nav_link_text( $link_text, $nav_item, $displayed_nav ) {
if ( $nav_item->slug === 'mentions' ) {
$link_text = 'Mentions';
}
return $link_text;
}
}
new Sukellos_BuddyPress_Manager();