Includere modelli personalizzati nei nostri plugin per WordPress
Penso che uno degli aspetti più sottovalutati – o forse uno degli aspetti raramente discussi dello sviluppo di plugin personalizzati – sia la possibilità di includere modelli personalizzati nei nostri plugin di WordPress.
E, ad essere onesti, ho capito: sono uno che è piuttosto convinto su cosa dovrebbe essere un plugin e cosa dovrebbe essere un tema.
Questo è:
- i temi sono per la presentazione,
- i plugin sono funzionalità.
Se includo modelli in un plug-in, non sto facendo la stessa cosa di quando gli sviluppatori includono funzionalità nei loro temi?
Come per tante cose in fase di sviluppo, penso che dipenda. Voglio dire, aggiungere molte funzionalità che ti bloccano in un tema è qualcosa di cui non sono un fan. Allo stesso modo, se hai un plug-in che ha lo scopo di mostrare i dati sul front-end ed è indipendente dal tema, allora ha senso.
Quindi devi essere giudizioso nelle tue decisioni.
Indipendentemente da ciò, esiste una serie comune di passaggi che possiamo utilizzare quando includiamo modelli personalizzati nei nostri plugin di WordPress.
Ed è ciò che questo post mostrerà.
Se intendi includere modelli personalizzati nel plug-in, suppongo che utilizzi sia modelli singoli che modelli di archivio. In caso contrario, utilizzare solo gli hook e il codice di seguito di cui si ha bisogno.
Per entrambi, però, sappi questi:
Usando questi hook, puoi dire a WordPress dove risiedono i modelli personalizzati nel tuo plug-in.
Organizzazione dei modelli
Per me, di solito ho una directory di modelli nel mio plug-in che si trova allo stesso livello delle directory asset, src e vendor.
Ciò rende facile sapere dove risiedono e fornisce un modo coerente per includerli in tutti i plugin che hai creato. Dopotutto, c’è qualcosa da dire per essere coerenti nelle convenzioni che utilizziamo.
Compresi i modelli
Supponendo che tu abbia il modello single-acme.php e il modello archive-acme.php, è facile includerlo. E anche se sono più un fan dell’utilizzo della programmazione orientata agli oggetti, mostrerò di includere questi modelli usando il codice procedurale.
È facile convertire questo codice in codice orientato agli oggetti, se lo desideri. Inoltre, suppongo che tu lo includa anche per i tipi di post personalizzati.
Puoi sempre omettere un condizionale per un tipo di post personalizzato se vuoi semplicemente includere questi modelli ma, nella mia esperienza, trovo raro che queste situazioni non utilizzino tipi di post personalizzati ma non conosco la tua situazione.
Detto questo, ecco il codice.
Definire i ganci
Per prima cosa, dobbiamo definire gli hook. Questo è relativamente semplice poiché useremo i ganci descritti sopra.
Innanzitutto, il modello unico :
<?php
add_action('single_template', 'acmeIncludeSingleTemplate');
/**
* Includes a custom, single template as included in a plugin. If
* the template is being viewed for a custom post type then use it;
* otherwise, use the template that's provided by WordPress at runtime.
*
* @param string $originalTemplate the path to the original template
*
* @return string the path to the original template or the custom template.
*/
function acmeIncludeSingleTemplate($originalTemplate)
{
// More to come...
}
E poi il modello di archivio :
<?php
add_action('archive_template', 'acmeIncludeArchiveTemplate');
/**
* Includes a custom, archive template as included in a plugin. If
* the template is being viewed for a custom post type then use it;
* otherwise, use the template that's provided by WordPress at runtime.
*
* @param string $originalArchiveTemplate the path to the original template
*
* @return string the path to the original template or the custom template.
*/
function acmeIncludeArchiveTemplate($originalArchiveTemplate)
{
// More to come...
}
E ora possiamo implementare il codice per ciascuna delle funzioni.
Aggiunta del codice
Quindi, per prima cosa, esamineremo il singolo modello :
<?php
add_action('single_template', 'acmeIncludeSingleTemplate');
/**
* Includes a custom, single template as included in a plugin. If
* the template is being viewed for a custom post type then use it;
* otherwise, use the template that's provided by WordPress at runtime.
*
* @param string $originalTemplate the path to the original template
*
* @return string the path to the original template or the custom template.
*/
function acmeIncludeSingleTemplate($originalTemplate)
{
$singleTemplate = plugin_dir_path(
dirname(
__DIR__) );
$singleTemplate .= '/templates/single-acme.php';
if ('acme-cpt' === get_post_type(get_the_ID())) {
if (file_exists($singleTemplate)) {
return $singleTemplate;
}
}
return $originalTemplate;
}
E ora il modello di archivio :
<?php
add_action('archive_template', 'acmeIncludeArchiveTemplate');
/**
* Includes a custom, archive template as included in a plugin. If
* the template is being viewed for a custom post type then use it;
* otherwise, use the template that's provided by WordPress at runtime.
*
* @param string $originalArchiveTemplate the path to the original template
*
* @return string the path to the original template or the custom template.
*/
function acmeIncludeArchiveTemplate($originalArchiveTemplate)
{
$archiveTemplate = plugin_dir_path(
dirname(
__DIR__) );
$archiveTemplate .= '/templates/archive-acme.php';
if ('acme-cpt' === get_post_type(get_the_ID())) {
if (file_exists($archiveTemplate)) {
return $archiveTemplate;
}
}
return $originalArchiveTemplate;
}
Se hai prestato molta attenzione al codice, sai che c’è ben poco di diverso. In effetti, il processo generale può essere così delineato:
- definire il gancio,
- individuare il modello,
- controlla il tipo di post personalizzato,
- il modello esiste, usalo
- in caso contrario, utilizzare il modello predefinito
E questo è il processo sia per i modelli singoli che per quelli di archivio.
Scrittura di modelli compatibili
E infine, e questo è importante soprattutto se vuoi rendere il modello il più agnostico possibile, cerco di utilizzare il maggior numero possibile di tag template WordPress integrati quando mostro il contenuto relativo al plugin. Ciò consente agli sviluppatori di temi di modellarlo facilmente per adattarlo al loro tema.
No, non sarai in grado di ospitare tutti i temi, ma questa è la natura dei temi di WordPress. Il punto è prendere il più possibile il lavoro di recupero e rendering dei dati dal modello in modo che gli sviluppatori front-end possano gestirlo facilmente.

