Fügen Sie dem Textklassenfilter beim Anzeigen der Unterseite oder des einzelnen Beitrags den Namen der übergeordneten Vorlage hinzu

Wie würde ich einen Filter für das body_class() -Tag body_class() , der es mir erlaubt, den Slug-Namen der Elternseiten als class zum Körper hinzuzufügen, wenn ich eine Unterseite oder einen Beitrag besuche?

Solutions Collecting From Web of "Fügen Sie dem Textklassenfilter beim Anzeigen der Unterseite oder des einzelnen Beitrags den Namen der übergeordneten Vorlage hinzu"

Hier:

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

Versuche dies:

 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' ); 

Sie erhalten zwei zusätzliche classn:

  • Parent-Slug- Postname
  • Eltern-Vorlage- Templatename

Ich habe versucht, in WordPresses post-template.php Datei suchen, wo die Body-class befindet und fand die function, die die class erzeugt, ich möchte hinzugefügt werden, wenn ich auch auf Unterseiten oder Beiträge und kopierte es in meine functions.php … dann ich hinzugefügt die is_single() und is_page() und das schien zumindest teilweise funktionieren, aber ich kann es nicht bekommen, um die Vorlage ID richtig, aber wie es selbst beim Besuch einer übergeordneten Seite.

Das habe ich ausprobiert:

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

Das ist was gesagt:

  

Beachten Sie die Seitenvorlage – das ist die class, die ich brauche, aber mit dem Rest des Vorlagennamens … also wäre es page-template-NAME-php.

Mein Ziel ist es, grundsätzlich die Elternschablonen-Namensklasse im body-Tag zu haben, wenn ich EINE Seite besuche, d. Seiten, Unterseiten, Beiträge, etc …


BEARBEITEN 1

Also habe ich es geschafft, dass der Code funktioniert, obwohl ich nicht sicher bin, ob ich es richtig gemacht habe?

Ich habe seinen Filter zuerst in meine functions.php gestellt:

 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']; } 

Dann fügte ich meinen letzten Code hinzu, den ich aus der WordPress-Core post-template.php Datei post-template.php entwarf und $classes[] = 'page-template-' . get_current_template(); hinzufügte $classes[] = 'page-template-' . get_current_template(); $classes[] = 'page-template-' . get_current_template(); wie er es so empfahl:

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

Sie werden auch bemerken, dass ich es nicht lesen wollte – page-template-name.php, also habe ich die sanitize_html_class( str_replace( '.', '-', get_current_template() )) , um den Punkt zu entfernen.

Dies ist einen Schritt näher, aber leider ruft es immer noch nicht den Namen der Elternvorlage auf, wenn er einzelne Beiträge oder Unterseiten besucht , sondern nur die aktuelle verwendete Vorlage. Dies ist auch nicht sehr nützlich auf einzelnen Post-Seiten, da es rendert: page-template-single-php anstelle der tatsächlichen einzelnen Vorlage verwendet wird, da ich mehrere verschiedene habe … daher, warum der Name der übergeordneten Vorlage angezeigt werden soll auf allen zugehörigen Seiten wäre am nützlichsten.

Jede zusätzliche Hilfe ist super geschätzt !!! – Es funktioniert fast !!!