comment puis-je créer un filtre pour la balise body_class()
qui me permette d'ajouter le nom du slug des pages parentes en tant que classe au corps à chaque visite d'une sous-page ou d'un message?
ici:
add_filter('body_class','body_class_slugs');
function body_class_slugs($classes) {
global $posts,$post;
if(is_single() || is_page()){ //only on a single post or page
if (isset($posts)){
$classes[] = $post[0]->post_name; //posts is an array of posts so we use the first one by calling [0]
}
elseif (isset($post)){
$classes[] = $post->post_name;
}
}
return $classes;
}
Essaye ça:
function my_body_class( $classes ) {
global $post;
# Page
if ( is_page() ) {
# Has parent / is sub-page
if ( $post->post_parent ) {
# Parent post name/slug
$parent = get_post( $post->post_parent );
$classes[] = 'parent-slug-'.$parent->post_name;
# Parent template name
$parent_template = get_post_meta( $parent->ID, '_wp_page_template', true);
if ( !empty($parent_template) )
$classes[] = 'parent-template-'.sanitize_html_class( str_replace( '.', '-', $parent_template ), '' );
}
}
return $classes;
}
add_filter( 'body_class', 'my_body_class' );
Vous aurez deux cours supplémentaires:
J'ai essayé de chercher dans wordpresses le fichier post-template.php où se trouve la classe body et trouvé la fonction qui génère la classe que je veux ajouter lorsque je suis également sur des sous-pages ou des publications et que je l'ai copiée dans mon functions.php ... puis je ajouté les is_single()
et is_page()
et qui semblaient au moins partiellement fonctionner, mais je ne parviens pas à le saisir correctement, mais comme il le fait lui-même lorsqu’il visite une page parent.
C'est ce que j'ai essayé:
add_filter('body_class','body_class_slugs');
function body_class_slugs($classes) {
global $wp_query, $wpdb;
if (is_single() || is_page() || is_page_template()) {
$classes[] = 'page-template';
$classes[] = 'page-template-' . sanitize_html_class( str_replace( '.', '-', get_post_meta( $page_id, '_wp_page_template', true ) ), '' );
}
return $classes;
}
C'est ce qui est sorti:
<body class="single single-post postid-852 single-format-standard page-template page-template-">
Notice page-template - , c'est la classe dont j'ai besoin mais avec le reste du nom du modèle ... ce serait donc page-template-NAME-php.
Mon objectif est de toujours avoir toujours la classe de nom de modèle parent présente dans la balise body lors de la visite de n'importe quelle page, c.-à-d. Pages, sous-pages, messages, etc ...
EDIT 1
J'ai donc réussi à obtenir le code de de t31os même si je ne suis pas sûr de l'avoir bien fait?
J'ai d'abord placé son filtre dans mon functions.php:
add_filter( 'template_include', 'var_template_include', 1000 );
function var_template_include( $t ){
$GLOBALS['current_theme_template'] = basename($t);
return $t;
}
function get_current_template( $echo = false ) {
if( !isset( $GLOBALS['current_theme_template'] ) )
return false;
if( $echo )
echo $GLOBALS['current_theme_template'];
else
return $GLOBALS['current_theme_template'];
}
Ensuite, j'ai ajouté mon dernier morceau de code que j'avais exclu de wordpresses fichier post-template.php
central et ajouté $classes[] = 'page-template-' . get_current_template();
comme il l'avait recommandé ainsi:
add_filter('body_class','body_class_slugs');
function body_class_slugs($classes) {
global $wp_query, $wpdb;
if (is_page_template() || is_page() || is_single()) {
$classes[] = 'page-template-' . sanitize_html_class( str_replace( '.', '-', get_current_template() ) );
}
return $classes;
}
Vous remarquerez également que je ne voulais pas qu'il lise - page-template-name.php , alors j'ai ajouté le sanitize_html_class( str_replace( '.', '-', get_current_template() ))
pour supprimer le point.
C'est un peu plus près, mais , malheureusement, il ne récupère toujours pas le nom du modèle parent de cette manière lorsque vous visitez des publications uniques ou des sous-pages , il ne récupère que le modèle actuel utilisé. Cela n’est pas non plus très utile sur les pages à publication unique, car il restitue: page-template-single-php
au lieu du modèle unique utilisé, car j’en ai plusieurs différents ..... c’est pourquoi il serait utile de récupérer le nom du modèle parent à afficher sur toutes les pages associées. le plus utile.
Toute aide supplémentaire est super appréciée !!! - Ça marche presque !!!