Wie entferne ich eine übergeordnete Themenseitenvorlage aus einem untergeordneten Thema?

17

Ich verwende das TwentyTen-Thema, um ein untergeordnetes Thema zu erstellen, aber ich kann die Seitenvorlage "Eine Spalte, keine Seitenleiste", die sich im übergeordneten TwentyTen-Thema befindet, scheinbar nicht entfernen.

Ich dachte, nur das Kopieren und Löschen der Inhalte würde den Trick tun, aber es scheint nicht. Weiß jemand, wie man das macht? Ich bin sicher, es ist sehr einfach.

Vielen Dank

osu

Osu
quelle

Antworten:

11

Das Überschreiben dieser Vorlage wäre viel einfacher, als sie loszuwerden. So wie es die Logik macht.

Ich behaupte nicht, dass es eine effiziente Idee ist (spät hier), aber dies würde sie vom Bearbeitungsbildschirm aus zerstören:

add_action('admin_head-post.php','remove_template');

function remove_template() {

    global $wp_themes;

    get_themes();
    $templates = &$wp_themes['Twenty Ten']['Template Files'];
    $template = trailingslashit( TEMPLATEPATH ).'onecolumn-page.php';
    $key = array_search($template, $templates);
    unset( $templates[$key] );
}
Rarst
quelle
Vielen Dank dafür, das sieht nach einer guten Lösung aus. Wenn Sie sagen, dass Sie die Vorlage überschreiben, bedeutet dies, dass Sie trotzdem nur eine einspaltige Vorlage darin einfügen? Oder meinst du es mit einer Vorlage überschreiben, die ich tatsächlich verwenden möchte (dh es eine Spalte nennen, aber es hat tatsächlich 2 oder 3 Spalten?)?
Osu
@Osu Ich meinte überschreiben mit Ihrer eigenen ähnlichen Vorlage. In logischer Hinsicht ist es für untergeordnete Themen einfach, Vorlagen für übergeordnete Themen zu ändern und hinzuzufügen, aber es ist schwierig, sie zu deaktivieren. Grundsätzlich soll ein Kindermotiv mehr als ein Elternmotiv und nicht weniger leisten. Und die Codelogik folgt diesem Prinzip.
Rarst
ach ja ok Danke, dass Sie das geklärt haben. Ich werde dann eine einfarbige Vorlage für sie erstellen. Cheers
Osu
Für alle, die das Thema mit jQuery aus der Dropdown-Liste entfernen möchten, ist dies ein weiterer Ansatz (nicht sicher, ob dies der beste Weg ist): pastie.org/3710683
Osu
2
Interna im Zusammenhang mit dem Thema @brasofilo wurden in 3.4 grundlegend überarbeitet und die API geändert, sodass viele ältere
Dinge
29

WordPress 3.9 führt einen theme_page_templatesFilter ein.

Das folgende Beispiel aus einem untergeordneten Thema functions.php" Twenty Fourteen " zeigt, wie die Vorlage "Contributor Page" entfernt wird:

function tfc_remove_page_templates( $templates ) {
    unset( $templates['page-templates/contributors.php'] );
    return $templates;
}
add_filter( 'theme_page_templates', 'tfc_remove_page_templates' );
Alex Angas
quelle
3
Dies sollte die aktualisierte akzeptierte Antwort für WP 3.9+ sein
helgatheviking
9

Im Folgenden wird die Antwort von @ Rarst erläutert. Es handelt sich um einen allgemeineren Ansatz, der nicht an ein bestimmtes Thema gebunden ist, sondern in der Datei functions.php Ihres eigenen untergeordneten Themas verwendet werden kann, um alle Seitenvorlagen für übergeordnete Themen zu ändern, die Sie entfernen möchten.

function remove_template( $files_to_delete = array() ){
    global $wp_themes;

    // As convenience, allow a single value to be used as a scalar without wrapping it in a useless array()
    if ( is_scalar( $files_to_delete ) ) $files_to_delete = array( $files_to_delete );

    // remove TLA if it was provided
    $files_to_delete = preg_replace( "/\.[^.]+$/", '', $files_to_delete );

    // Populate the global $wp_themes array
    get_themes();

    $current_theme_name = get_current_theme();

    // Note that we're taking a reference to $wp_themes so we can modify it in-place
    $template_files = &$wp_themes[$current_theme_name]['Template Files'];

    foreach ( $template_files as $file_path ){
        foreach( $files_to_delete as $file_name ){
            if ( preg_match( '/\/'.$file_name.'\.[^.]+$/', $file_path ) ){
                $key = array_search( $file_path, $template_files );
                if ( $key ) unset ( $template_files[$key] );
            }
        }
    }
}

So können Sie es in der Datei functions.php Ihres Kinderthemas wie folgt verwenden:

add_action( 'admin_head-post.php', 'remove_parent_templates' );

function remove_parent_templates() {
    remove_template( array( "showcase.php", "sidebar-page" ) );
}

Hier zeige ich nur, dass Sie den Teil ".php" nicht übergeben müssen, wenn Sie nicht möchten.

Oder: remove_template( "sidebar-page" );- Sie müssen kein Array übergeben, wenn Sie nur eine einzelne Datei ändern möchten.

Tom Auger
quelle
6

Es gibt einen neuen Filter in WP Core (3.9) zum Entfernen von Seitenvorlagen. Es kann aus untergeordneten Themen verwendet werden.

So erreichen Sie dies in TwentyTen (getestet in WP 3.9):

add_filter( 'theme_page_templates', 'my_remove_page_template' );
    function my_remove_page_template( $pages_templates ) {
    unset( $pages_templates['onecolumn-page.php'] );
    return $pages_templates;
}

https://core.trac.wordpress.org/changeset/27297

http://boiteaweb.fr/theme_page_templates-hook-semaine-16-8033.html

Marcio Duarte
quelle
Ein Link außerhalb der Site wird unbrauchbar, wenn der Link geändert oder entfernt wird. Dies macht auch keinen Versuch, die Frage tatsächlich zu beantworten
Tom J Nowell
Fair genug, fügte ein Beispiel hinzu.
Marcio Duarte
1

Da frühere Antworten hier in aktuellen Versionen von WordPress nicht mehr funktionieren und es eine verwandte Frage gab, die ich gerade (April 2013) mit einem PHP-Ausgabepuffer beantwortete, stellte ich mir vor , dass ich einen Link zu dieser Antwort posten würde .

Ebenfalls gerade veröffentlicht wurde das Plugin Übergeordnete Themenseitenvorlagen auslassen, mit dem alle übergeordneten Themenseitenvorlagen aus der Dropdown-Liste der Vorlagen in der Metabox Seitenattribute herausgefiltert werden, wenn eine WordPress- Seite hinzugefügt oder bearbeitet wird .

MikeSchinkel
quelle
0

10. Juli 2012 - WordPress 3.4.1

Vorherige Antworten funktionieren nicht und wie in einem Kommentar gesagt:

Themenbezogene Interna wurden in 3.4 grundlegend überarbeitet und API-Änderungen vorgenommen, sodass viele ältere Dinge nicht funktionieren

Schnelle und schmutzige jQuery-Lösung

add_action('admin_head', 'wpse_13671_script_enqueuer');

function wpse_13671_script_enqueuer() {
    global $current_screen;

    /**
     * /wp-admin/edit.php?post_type=page
     */
    if('edit-page' == $current_screen->id) 
    {
        ?>
        <script type="text/javascript">         
        jQuery(document).ready( function($) {
            $("a.editinline").live("click", function () {
                var ilc_qe_id = inlineEditPost.getId(this);
                setTimeout(function() {
                        $('#edit-'+ilc_qe_id+' select[name="page_template"] option[value="showcase.php"]').remove();  
                    }, 100);
            });

            $('#doaction, #doaction2').live("click", function () {
                setTimeout(function() {
                        $('#bulk-edit select[name="page_template"] option[value="showcase.php"]').remove();  
                    }, 100);
            });       
        });    
        </script>
    <?php
    }

    /**
     * /wp-admin/post.php?post=21&action=edit
     */
    if( 'page' == $current_screen->id ) 
    {
        ?>
        <script type="text/javascript">
        jQuery(document).ready( function($) {
            $('#page_template option[value="showcase.php"]').remove();
        });
        </script>
    <?php
    }
}

Kein Haken dafür?

Wenn ich den richtigen Weg eingeschlagen habe, passiert hier die "Aktion" ( /wp-includes/class-wp-theme.php) und es sieht so aus, als gäbe es hier nichts, woran ich mich festhaken könnte ...

/**
 * Returns the theme's page templates.
 *
 * @since 3.4.0
 * @access public
 *
 * @return array Array of page templates, keyed by filename, with the value of the translated header name.
 */
public function get_page_templates() {
    // If you screw up your current theme and we invalidate your parent, most things still work. Let it slide.
    if ( $this->errors() && $this->errors()->get_error_codes() !== array( 'theme_parent_invalid' ) )
        return array();

    $page_templates = $this->cache_get( 'page_templates' );

    if ( ! is_array( $page_templates ) ) {
        $page_templates = array();

        $files = (array) $this->get_files( 'php', 1 );

        foreach ( $files as $file => $full_path ) {
            $headers = get_file_data( $full_path, array( 'Template Name' => 'Template Name' ) );
            if ( empty( $headers['Template Name'] ) )
                continue;
            $page_templates[ $file ] = $headers['Template Name'];
        }

        $this->cache_add( 'page_templates', $page_templates );
    }

    if ( $this->load_textdomain() ) {
        foreach ( $page_templates as &$page_template ) {
            $page_template = $this->translate_header( 'Template Name', $page_template );
        }
    }

    if ( $this->parent() )
        $page_templates += $this->parent()->get_page_templates();

    return $page_templates;
}
Brasofilo
quelle