Anzeigen der Verwendung von WordPress-Seitenvorlagen (oder nicht verwendet)

7

Wenn ich eine neue Seite in WordPress erstelle, kann ich angeben, welche Vorlage aus meinem Thema verwendet werden soll (aus einer Dropdown-Liste auf der rechten Seite der Benutzeroberfläche).

Ich muss herausfinden, welche der verfügbaren Vorlagen nicht verwendet werden, damit ich sie löschen kann.

Wie geht das bitte?

Die WP-Version ist 4.2.2

EvilDr
quelle

Antworten:

6

Sie müssen lediglich die Werte des Metafelds vergleichen _wp_page_template, das die für eine einzelne Seite ausgewählte Seitenvorlage mit den verfügbaren Seitenvorlagen enthält.

Dazu müssen Sie ein Array verwendeter Vorlagen erstellen, da die Vorlagen von allen Seiten verwendet werden sollen, ähnlich wie hier gezeigt:

Verwenden Sie array_uniquediese Option , um eindeutige Werte abzurufen.

Dann müssen Sie die verfügbaren Seitenvorlagen erhalten, wie hier gezeigt:

Last but not least können Sie array_diffdie Arrays der verwendeten und verfügbaren Vorlagen vergleichen, um anschließend die nicht verwendeten Vorlagen zu erhalten.

Nicolai
quelle
Vielen Dank. Da meine Stärken eher im Datenbankland als in PHP liegen, habe ich den folgenden SQL-Code verwendet, um eine ähnliche Ausgabe bereitzustellen, die später mit Zählungen usw. Optimiert werden kann SELECT p.post_title as PostTitle, m.meta_value as Template FROM `wp_postmeta` as m join `wp_posts` as p ON p.ID = m.post_id where ((p.post_type = 'page') OR (p.post_type = 'post')) AND (m.meta_key = '_wp_page_template');. Ihre Eingabe war von unschätzbarem Wert, um herauszufinden, wo sich die richtigen Datenbankfelder befanden.
EvilDr
1
Gern geschehen! Sicher, SQL ist auch ein Weg. Nur als allgemeiner Tipp, wenn verfügbar und geeignet, WordPress-API-Funktionen zu verwenden, erleichtert es die WP-Entwicklung auf lange Sicht. Ich sagte mein Stück :) @EvilDr
Nicolai
3

Aktualisieren:

Informationen zur Verwendung von Seitenvorlagen in WordPress 4.4+

In WordPress 4.4 array_intersect_assoc()wurde das aus der WP_Theme::get_page_templates()Methode entfernt.

Siehe Ticket Nr. 13265 und Änderungssatz Nr. 34995 .

Wir können daher die Verwendungsinformationen für Seitenvorlagen mit dem theme_page_templatesFilter direkt in die Dropdown-Liste der Vorlagen einfügen , ohne Javascript oder einige clevere Tricks für den Objekt-Cache zu verwenden, die hier von @MikeSchinkel oder hier von @gmazzap erläutert werden .

Hier ist eine Demo ( PHP 5.4+ ):

add_filter( 'theme_page_templates', function( $page_templates, $obj, $post )
{
    // Restrict to the post.php loading
    if( ! did_action( 'load-post.php' ) )
        return $page_templates;

    foreach( (array) $page_templates as $key => $template )
    {
        $posts = get_posts( 
            [
                'post_type'      => 'any',
                'post_status'    => 'any', 
                'posts_per_page' => 10,
                'fields'         => 'ids',
                'meta_query'     => [
                    [
                        'key'       => '_wp_page_template',
                        'value'     => $key,
                        'compare'   => '=',
                    ]
                ]
            ]
        );

        $count = count( $posts );

        // Add the count to the template name in the dropdown. Use 10+ for >= 10
        $page_templates[$key] = sprintf( 
            '%s (%s)', 
            $template, 
             $count >= 10 ? '10+' : $count
        );          
    }
    return $page_templates;
}, 10, 3 );

Beispiel:

Hier können wir sehen, wie es aussehen könnte, wobei die Informationen zur Nutzungsanzahl zu den Vorlagennamen hinzugefügt werden:

Informationen zur Verwendung von Vorlagen

Ich hoffe, Sie können dies an Ihre Bedürfnisse anpassen!

Birgire
quelle
Gute Idee, aber fast unmöglich, die Einschränkung durch den Kerncode zu überwinden - mit PHP. Die page_template_dropdown()Funktion gibt auch nicht die Möglichkeit.
Nicolai
Manchmal ist es nur eine Codezeile im Kern, die den Unterschied ausmacht ;-) Javascript kann eine Möglichkeit sein, das Dropdown-Menü für Vorlagen anzupassen, oder man kann preg_replace()die Ausgabe von page_attributes_meta_box()ausprobieren, um das Dropdown-Menü auszutauschen, oder einfach versuchen, die WP_ThemeKlasse zu erweitern . Oder auf andere Weise ;-) @ialocin
Birgire
Sicher, manchmal ist es nur eine Zeile und manchmal ist es fast alles :) Und sicher, wo ein Wille ist, ist auch ein Weg.
Nicolai
1
hehe und manchmal ist es nur WordPress ;-)
birgire
Sieht aus wie WordPress 4.4 die glückliche Version war ;-) @ialocin
Birgire