web-dev-qa-db-fra.com

Ajouter le nom du modèle parent au filtre de la classe de corps lors de la visite d'une sous-page ou d'une publication unique

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?

2
Mr.Brown

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;
}
0
Bainternet

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:

  • parent-slug - postname
  • parent-template - nom-modèle
2
kucrut

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 !!!

0
Mr.Brown