Come includere un file usando get_template_part() in un plugin?

28 nov 2013, 17:38:59
Visualizzazioni: 51.7K
Voti: 29

Una domanda molto semplice forse, ma sto avendo difficoltà. Nello sviluppo dei temi, ho lavorato con get_template_part() molte volte e ne comprendo le basi. Ma quando sto sviluppando un plugin, usandolo mi mostra alcuni errori:

Notice: Use of undefined constant STYLESHEETPATH - assumed 'STYLESHEETPATH' in ...\wp-includes\template.php alla riga 407

e

Notice: Use of undefined constant TEMPLATEPATH - assumed 'TEMPLATEPATH' in ...\wp-includes\template.php alla riga 410

Cercando su Google il problema ho trovato una soluzione di supporto:

Ma sembra una soluzione molto complessa - ne dubito. Penso che non dovrebbe essere così complicato. Ho controllato questa Risposta WPSE e ho trovato questa riga di codice:

if ( '' === locate_template( 'loop-mycustomposttype.php', true, false ) )
    include( 'loop-mycustomposttype.php' );

Dove c'è una funzione PHP include(). In base alla mia conoscenza di WordPress ho imparato a preferire get_template_part() rispetto a PHP include(). Quindi come posso esattamente usare un semplice get_template_part() nel mio plugin.

Non sto usando alcun loop o simili, sto solo separando (o si potrebbe dire organizzando) il codice del mio plugin in file diversi in modo che in alcuni casi, posso semplicemente commentarli per eliminarli dove non sono necessari. Ho provato:

get_template_part( 'my', 'special-admin' );

e poi dopo l'errore, l'ho cambiato in:

get_template_part( 'my', 'specialadmin' );

Ma sai che non è questo il problema. Sono su un server locale, usando WAMP.

0
Tutte le risposte alla domanda 3
0
19

get_template_part è una funzione del tema. Non puoi caricare file di plugin con questa funzione. Dai un'occhiata al codice sorgente e noterai che il lavoro viene svolto da locate_template. Guarda quel sorgente e vedrai che carica sempre dalle directory del tema.

Per quanto tu possa voler usare get_template_part, è la funzione sbagliata.

Dovrai usare include per i tuoi file.

Il motivo, a quanto pare, per get_template_part è consentire l'estensione dei temi – ovvero, facilitare la creazione di temi child. I plugin non sono pensati per essere estesi in quel modo, quindi non c'è bisogno di get_template_part o di un equivalente per i plugin.

28 nov 2013 17:56:19
0
15

@s_ha_dum ha ragione sul fatto che get_template_part sia una funzione del tema, ma si sbaglia nell'affermare che i plugin non sono pensati per essere estesi in questo modo. È semplicemente più complicato.

Questo articolo di Pippin, descrive come utilizzare una funzione che si occuperà di caricare i template del tuo plugin, consentendo agli utenti di sovrascrivere i template del plugin all'interno del loro tema.

In sostanza, cerca in una cartella speciale del tema, poi se non trova nulla lì, cerca nella cartella dei template del plugin.

24 giu 2015 22:04:03
0

Come detto in precedenza, non puoi utilizzare get_template_part nei plugin, ma esiste una classe utile su Github (creata da Gary Jones) che emula la funzionalità di get_template_part nei plugin, aggiungendo il plugin alla gerarchia di fallback (child theme > parent theme > plugin).

In questo modo, puoi sovrascrivere i "template part" del tuo plugin all'interno di un child theme o di un parent theme.

Utilizzo (tratto dalle istruzioni del repository Github):

  1. Copia class-gamajo-template-loader.php nel tuo plugin. Può essere inserito in un file nella root del plugin o, meglio ancora, in una directory includes.
  2. Crea un nuovo file, ad esempio class-your-plugin-template-loader.php, nella stessa directory.
  3. Crea una class in quel file che estende Gamajo_Template_Loader.
  4. Sovrascrivi le proprietà della classe per adattarle al tuo plugin. Potresti anche sovrascrivere il metodo get_templates_dir() se non è adatto alle tue esigenze.
  5. Ora puoi istanziare la tua classe personalizzata di template loader e utilizzarla per chiamare il metodo get_template_part(). Questo potrebbe essere all'interno di un callback di uno shortcode o qualcosa che vuoi che gli sviluppatori di temi includano nei loro file.

Codice di esempio:

// Template loader istanziato altrove, ad esempio nel file principale del plugin.
$meal_planner_template_loader = new Meal_Planner_Template_Loader;

// Usalo per chiamare il metodo get_template_part(). Questo potrebbe essere 
// all'interno di un callback di uno shortcode o qualcosa che vuoi 
// che gli sviluppatori di temi includano nei loro file.
$meal_planner_template_loader->get_template_part( 'recipe' );

// Se vuoi passare dati al template, chiama il metodo set_template_data() 
// con un array prima di chiamare get_template_part().        
// set_template_data() restituisce l'oggetto loader per permettere il method chaining.
$data = array( 'foo' => 'bar', 'baz' => 'boom' );

$meal_planner_template_loader
    ->set_template_data( $data );
    ->get_template_part( 'recipe' );

// Il valore di bar è ora disponibile all'interno del template recipe come $data->foo.
// Se desideri utilizzare un nome di variabile diverso, aggiungi un secondo parametro 
// a set_template_data():
$data = array( 'foo' => 'bar', 'baz' => 'boom' );

$meal_planner_template_loader
    ->set_template_data( $data, 'context' )
    ->get_template_part( 'recipe', 'ingredients' );

// Il valore di bar è ora disponibile all'interno del template recipe come $context->foo.
7 mag 2017 23:34:05