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


13

Potrebbe essere una domanda molto semplice, ma sto lottando. Nello sviluppo del tema, ho lavorato get_template_part()molte volte e ne comprendo le basi. Ma quando sto sviluppando un plugin, mi chiedevo di usarlo mostrandomi alcuni errori:

Avviso: utilizzo della costante indefinita STYLESHEETPATH - assunto "STYLESHEETPATH" nella ...\wp-includes\template.phpriga 407

e

Avviso: uso della costante indefinita TEMPLATEPATH - assunto 'TEMPLATEPATH' nella ...\wp-includes\template.phpriga 410

Googling il problema ha mostrato una correzione del supporto:

Ma sembra un'enorme soluzione alternativa - ne dubito. Penso che non dovrebbe essere molto 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 include()funzione PHP . Secondo la mia conoscenza di WordPress ho imparato a preferire get_template_part()PHP include(). Quindi come posso usare esattamente un semplice get_template_part()nel mio plugin.

Non sto usando alcun loop o qualcosa del genere, sto solo separando (o potresti dire organizzando) il mio codice plugin in diversi file in modo che in alcuni casi, semplicemente li commenterò per rilasciarli dove non sono necessari. Provai:

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

e quindi dopo l'errore, lo ha cambiato in:

get_template_part( 'my', 'specialadmin' );

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

Risposte:


11

get_template_partè una funzione tematica . Non puoi caricare file plugin con quella funzione. Dai un'occhiata alla fonte e noterai che il lavoro è svolto locate_template. Guarda quella fonte e vedrai che si carica sempre dalle directory dei temi .

Per quanto tu possa desiderare di usarlo get_template_partè la funzione sbagliata.

Avrai bisogno dei includetuoi file.

Il motivo, quindi mi sembra, get_template_partè di consentire l'estensione dei temi, ovvero per facilitare la creazione di temi per bambini. I plug-in non intendono essere estesi in questo modo, quindi non è necessario get_template_parto equivalente.


6

@s_ha_dum ha ragione che get_template_partè una funzione del tema, ma non è corretto che i plugin non siano destinati ad essere estesi in questo modo. È semplicemente più complicato.

Questo post di Pippin descrive come utilizzare una funzione che farà il lavoro di caricamento dei modelli di plugin, consentendo agli utenti di sovrascrivere i modelli di plugin all'interno del proprio tema.

In sostanza, cerca in una cartella speciale nel tema, quindi se non lo trova, cerca nella cartella dei modelli il plugin.


4

Come detto in precedenza, non è possibile utilizzare get_template_partnei plug-in, ma esiste una comoda classe su Github (creata da Gary Jones) che imita la get_template_partfunzionalità nei plug-in, aggiungendo il plug-in al fallback (tema figlio> tema principale> plugin).

In questo modo, puoi sovrascrivere la "parte del modello" del tuo plugin all'interno di un tema figlio o di un tema principale.

Utilizzo (tratto dalle istruzioni del repository Github):

  1. Copia class-gamajo-template-loader.phpnel tuo plugin. Può trovarsi in un file nella radice del plug-in o, meglio, in una directory include.
  2. Creare un nuovo file, ad esempio class-your-plugin-template-loader.php, nella stessa directory.
  3. Creare un classin quel file che si estende Gamajo_Template_Loader.
  4. Sostituisci le proprietà della classe per adattarle al tuo plugin. Puoi anche sostituire il get_templates_dir()metodo se non è adatto a te.
  5. È ora possibile creare un'istanza della classe del caricatore di modelli personalizzata e utilizzarla per chiamare il get_template_part()metodo. Questo potrebbe essere all'interno di un callback di shortcode o qualcosa che vuoi che gli sviluppatori di temi includano nei loro file.

Codice di esempio:

// Template loader instantiated elsewhere, such as the main plugin file.
$meal_planner_template_loader = new Meal_Planner_Template_Loader;

// Use it to call the get_template_part() method. This could be within 
// a shortcode callback, or something you want theme developers 
// to include in their files.
$meal_planner_template_loader->get_template_part( 'recipe' );

// If you want to pass data to the template, call the set_template_data() 
// method with an array before calling get_template_part().        
// set_template_data() returns the loader object to allow for method chaining.
$data = array( 'foo' => 'bar', 'baz' => 'boom' );

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

// The value of bar is now available inside the recipe template as $data->foo.
// If you wish to use a different variable name, add a second parameter 
// to set_template_data():
$data = array( 'foo' => 'bar', 'baz' => 'boom' );

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

// The value of bar is now available inside the recipe template as $context->foo.
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.