Come posso aggiungere un'opzione all'elenco dei modelli di pagina da un plugin?


10

Ho cercato nelle ultime due ore un modo per creare un modello di pagina personalizzato all'interno di un plugin, ma non ho ancora avuto fortuna.

Quello che sto specificamente cercando di fare è aggiungere un'opzione all'elenco dei modelli di pagina disponibili durante la modifica di una pagina e non utilizzare altri metodi comeif( is_page( 'page-slug' ) ) { /* etc */ }

Esiste una variabile globale che posso modificare per farlo?

Modificare:

Attualmente sto usando questo codice, basato sul link @ m0r7if3r che mi ha dato in un commento, il problema è che eseguirà questa funzione quando si visualizza la pagina, ma non quando si modifica la pagina (per popolare l'elenco a discesa con i modelli di pagina) :

class JW_SiteGrader {

    private static $instance;

    private function __construct() {


        add_action( 'template_redirect', array( &$this, 'sitegrader_template_redirect' ), 20 );

    }

    public static function getInstance() {

        // Return the class data in a Singleton fashion
        if (self::$instance == null)
            self::$instance = new JW_SiteGrader();
        return self::$instance;

    }

    public function sitegrader_template_redirect() {

        add_filter( 'page_template', array( &$this, 'sitegrader_page_template' ), 10, 1 );

    }

    public function locate_plugin_template( $template_names, $load = false, $require_once = true ) {

        if ( !is_array( $template_names ) )
            return '';

        $located = '';

        $this_plugin_dir = WP_PLUGIN_DIR . '/' . str_replace( basename( __FILE__ ), '', plugin_basename( __FILE__ ) );

        foreach ( $template_names as $template_name ) {

            if ( !$template_name )
                continue;

            if ( file_exists( STYLESHEETPATH . '/' . $template_name ) ) {

                $located = STYLESHEETPATH . '/' . $template_name;
                break;

            } else if ( file_exists( TEMPLATEPATH . '/' . $template_name ) ) {

                $located = TEMPLATEPATH . '/' . $template_name;
                break;

            } else if ( file_exists( $this_plugin_dir .  $template_name ) ) {

                $located =  $this_plugin_dir . $template_name;
                break;

            }

        }

        if ( $load && '' != $located )
            load_template( $located, $require_once );

        return $located;
    }

    public function sitegrader_page_template( $template ) {

        $object = get_queried_object();

        if ( 'page' == $object->post_type ) {

            // New 
            $templates[] = "page-sitegrader.php";
            // Like in core
            $templates[] = "page-{$object->post_type}.php";
            $templates[] = "page.php";

            return locate_template( $templates );  

        }

        // return apply_filters('page_template', $template);
        return $template;
    }

}

Modifica 2:

Sembra che questa funzionalità verrà rilasciata in un futuro aggiornamento, ho letto alcuni ticket trac su questo e ci sono state alcune discussioni ma nessuna risposta reale (sperando in 3.4). Elencherà qui un po 'gli URL dei ticket trac.

Modifica 3:

Il codice sopra funziona, MA l'unico problema che sto avendo a questo punto è che non c'è nessun modello che viene aggiunto all'elenco a discesa durante la modifica / aggiunta di una nuova pagina. Sto provando alcune cose e aggiornerò presto la mia domanda.


2
Hai provato qualcosa di simile a questo ?
mor7ifer,

@ m0r7if3r (Se lo provi, ti preghiamo di lasciare un messaggio su come ha funzionato - Grazie!)
Kaiser

@kaiser Ho provato il codice che mi ha consigliato, l' unico link mancante è ottenere la meta box per aggiungere il modello all'elenco a discesa (per quanto ne so!).
Jared,

@Jared Guarda questa mia risposta a una Q simile e ai relativi biglietti trac nella parte inferiore della a. Inserisci il tuo codice) Se non viene visualizzato in ogni pagina, stai utilizzando gli hook errati per eseguire l'istanza. Quali ganci stai usando?
Kaiser,

@kaiser Sto usando l' page_templatehook, il codice sopra nella mia modifica è quello che viene attualmente utilizzato. Devo usare il template_redirectgancio e quindi aggiungere il page_templatefiltro?
Jared,

Risposte:


4

Filtri? Chiunque?

Non c'è nessun c'è filtro per aiuto: page_template_dropdown($template);viene utilizzato per costruire la caduta verso il basso e non è filtrabile.

Intrufolarsi nella matrice dei modelli?

Per creare il contenuto dei menu a discesa, utilizza la meta box principale get_page_templates(). Dall'interno, la funzione è simile alla seguente:

$themes = get_themes();
$theme = get_current_theme();
$templates = $themes[$theme]['Template Files'];

Ma quando si guarda dentro, get_themes();allora non ci sono possibilità di intercettare l'elenco dei modelli. Inoltre abbiamo il problema, che non c'è possibilità di ottenere un modello dall'esterno della directory dei temi ...

... Fingendo un tema!

La teoria e i suoi svantaggi ...

È possibile utilizzare register_theme_directory()per aggiungere una directory di temi aggiuntiva in cui è possibile posizionare modelli. Quindi la cosa più semplice sarebbe registrare anche il tuo plugin come cartella dei temi:

// Register during init hook:
register_theme_directory( plugin_dir_path( __FILE__ ).'templates' );

Nota: qui non sono sicuro che funzionerà .

Durante l'attivazione del plug-in: è necessario inserire un style.css.phpfile nella templatescartella. Ciò ti consentirebbe di aggiungere variabili al tuo file. Questa variabile sarebbe quindi il tema principale. E il tema principale dovrebbe essere semplicemente il tema attualmente attivo. Quindi aggiorna il tema attivo al plug-in.

Svantaggio n. 2: Informazioni sull'interfaccia utente "Aspetto" ... Forse aggiungi una nota che questo "Tema" non è pensato per essere utilizzato come tema reale. Lascio il resto di »Evita di attivare questo tema« roba fino alla tua immaginazione. Comunque: dovrebbe funzionare.

Svantaggio n. 2: questo trucco eviterà con successo temi figlio. Puoi avere un tema genitore. Niente di più.


Quindi sto indovinando che non esiste un modo effettivo di utilizzare modelli di pagina personalizzati da qualsiasi tema inattivo, giusto? Potrei registrare una directory dei temi, ma i modelli non sono disponibili per l'uso a meno che quel tema non sia attivo.
Jared,

1
Non proprio. Non dovrebbe essere e quindi una mancanza di core. Hai provato il link per ipstenu sopra? Ho già provato a percorrere quella strada ma sono finito in un modo morto - con un'altra soluzione. La scommessa migliore sarebbe seguire i biglietti, spingerli e collegarli ovunque tu sia. : /
kaiser

2

Come suggerimento per una potenziale soluzione hai preso in considerazione l'utilizzo del file system WordPress per scrivere un file modello di pagina dal tuo plug-in nella directory dei temi attiva corrente? A seconda di quanto controllo vuoi su questo processo puoi fare in modo che il tuo plugin scriva il file all'attivazione e lo rimuova alla disinstallazione. In alternativa, è possibile creare file di modello di pagina in modo dinamico dall'interfaccia utente del plug-in utilizzando un modulo per passare determinati valori come il nome del modello di pagina che deve apparire nella casella a discesa della schermata di modifica post. In teoria puoi anche rimuovere il modello di pagina dall'interfaccia utente del plug-in con un clic di un pulsante e allo stesso modo aggiungere più modelli per scopi diversi. C'è un buon post sull'uso del file system sul blog di Otto. Non ho il link con me ora ma puoi cercarlo.

Spero che rilascino ciò che intendevi fare con un gancio nella prossima versione core.


1
Avevo un metodo esattamente come questo prima, ma avevo molti problemi quando l'ho provato, perché quando un utente cambiava temi, non eliminava il file modello e se copiavano il tema attivo e lo inserivano in un sito diverso , rischierebbero di caricare un file modello personalizzato che non funzionerebbe. So che ci sono diverse soluzioni alternative, ma voglio davvero che sia automatico . +1 per il suggerimento però.
Jared,

1
Ciao Jared, ero anche preoccupato per lo stesso problema. L'unica soluzione che potrei pensare di estendere ulteriormente questo metodo alternativo sarebbe quella di fare in modo che il plug-in dopo l'attivazione ottenga il nome del tema corrente, quindi se un utente disattiva / cambia temi è possibile eliminare il file modello da quel tema e riscriverlo nel nuovo attivato tema. Dai un'occhiata a questo link dove ha creato i suoi hook di attivazione / disattivazione per controllare i temi. Con un po 'di codice in più penso che sia fattibile.
Adam,

Assolutamente, penso che potrebbe funzionare. Ci proverò e pubblicherò i risultati nella mia domanda. Grazie per il link, aiuta!
Jared,

1

Ho dato un'occhiata alla fonte, e in modo abbastanza sorprendente non sembra esserci un modo per farlo! Il mio suggerimento suggerito sarebbe quello di aggiungere una seconda meta box con un override tema / menu a discesa secondo tema. Quindi agganciare questo filtro:

# wp-includes/theme.php line 751 in 3.3.1:
return apply_filters( "{$type}_template", locate_template( $templates ) );

per restituire il file del tema se è stato sostituito. Ovviamente, vorresti aggiungere add_filter solo se è il post che desideri.

Se vuoi essere fantasioso, puoi scartare la scatola originale e ricrearla (tramite i filtri ovviamente, non modificando il codice principale).

Suggerirei anche di aggiungere un ticket trac che richiede tale funzionalità (se non ce n'è già uno lì per esso).


1
accetto w / suggerendo questo per trac.
Helgatheviking,

Sembra già essere nel trac: core.trac.wordpress.org/ticket/15803
Jared

1
Ho appena esaminato questo per un'altra Q sui modelli di tipo singolo post . Puoi trovare i biglietti Trac alla fine della risposta. Let speranza per 3.4.
Kaiser

1

In passato l'ho realizzato rimuovendo il modello di pagina predefinito metabox e quindi aggiungendo il tuo metabox. Ho avuto il nuovo metabox che utilizzava get_page_templates integrato e quindi ho aggiunto gli altri di cui avevo bisogno a livello di programmazione. Su un salvataggio può aggiornare il modello di pagina proprio come fa WordPress.


Ti dispiacerebbe mostrare il codice completo? Attualmente è solo un concetto approssimativo. Grazie.
Kaiser


-2

Un risultato di ricerca con DuckDuckGo aggiunge un modello di pagina wordpress che mi ha dato la risposta su una pagina wpmu.org intitolata WordPress Custom Page Template Tutorial .

In sostanza, all'interno della directory dei temi, wp-content / themes / your-theme , copia un modello di pagina esistente in un nuovo nome di file php di tua scelta. Modifica il nuovo file, avendo cura di cambiare il valore della proprietà "Nome modello:" nel commento nella parte superiore del file.

Era tutto quello che c'era da fare. È possibile che questa sia una funzionalità che post-data la domanda. Sto usando WP 3.5 con il tema ventiquattro.

È anche possibile che esistano modi più puliti per estendere un tema. Modifiche come questa potrebbero essere sovrascritte dagli aggiornamenti dei temi. Colpa mia.


Ho bisogno di una soluzione per aggiungere il modello all'elenco a discesa da un plugin, non un tema. :(
Jared
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.