Come caricare JS e CSS solo su pagine specifiche usando is_page()?
Sto sviluppando il mio primo plugin WP, che dovrebbe caricare alcuni file JS e CSS solo su pagine specifiche selezionate attraverso un form disponibile nell'area di amministrazione del plugin. Una volta selezionato nel form, il Titolo della Pagina viene memorizzato nella tabella wp_options del database, poi i dati vengono recuperati in una variabile chiamata $page_selected. Per caricare i file JS e CSS solo nelle pagine selezionate nel form, volevo utilizzare la funzione is_page(), passando la variabile $page_selected come parametro.
// Funzione per caricare tooltip personalizzato
function my_custom_tooltip() {
if ( is_page($page_selected) ) {
wp_enqueue_style( 'custom_tooltip_frontend_css', plugins_url('custom-image-tooltip/custom-image-tooltip.css') );
wp_enqueue_script( 'custom_tooltip_frontend_js', plugins_url('custom-image-tooltip/custom-image-tooltip.js'), array('jquery'), '', true );
}
} add_action('wp_enqueue_scripts', 'my_custom_tooltip');
Sfortunatamente nel mio caso quella condizione non funziona correttamente. C'è un modo per ottenere lo stesso risultato, facendo corrispondere la pagina selezionata nel form dall'utente con la Pagina attualmente visualizzata?

Se $page_selected
restituisce una stringa contenente il titolo della pagina, dovrebbe funzionare correttamente. Ho testato e is_page()
accetta il titolo della pagina, l'ID della pagina e lo slug.
Se stai riscontrando problemi, sarà meglio memorizzare l'ID della pagina nel database e utilizzarlo con is_page()
Consulta https://codex.wordpress.org/Function_Reference/is_page per maggiori dettagli sugli argomenti possibili che possono essere passati a questa istruzione condizionale.

Ho apportato alcune modifiche piuttosto interessanti e spero che ti siano utili. Prova il codice qui sotto:
function my_custom_tooltip() {
wp_enqueue_style( 'custom_tooltip_frontend_css', plugins_url('custom-image-tooltip/custom-image-tooltip.css') );
wp_enqueue_script( 'custom_tooltip_frontend_js', plugins_url('custom-image-tooltip/custom-image-tooltip.js'), array('jquery'), '', true );
}
if(is_page($page_selected)){
add_action('wp_enqueue_scripts', 'my_custom_tooltip');
}
Qui, assicurati riguardo a $page_selected
.
NOTA: Dovresti sempre accodare i tuoi script nel file functions.php del tema - non in un file template. I file template semplicemente non sono il posto giusto nel 99.9% dei casi.
Puoi usare is_page()
in diverse forme come:
// Quando viene visualizzata qualsiasi singola Pagina.
is_page();
// Quando viene visualizzata la Pagina 42 (ID).
is_page( 42 );
// Quando viene visualizzata la Pagina con post_title "Contatti".
is_page( 'Contatti' );
// Quando viene visualizzata la Pagina con post_name (slug) "su-di-me".
is_page( 'su-di-me' );
// Restituisce true quando la Pagina visualizzata è l'ID 42, o il post_name "su-di-me", o il post_title "Contatti".
is_page( array( 42, 'su-di-me', 'Contatti' ) );
Nota: La funzionalità dell'array è stata aggiunta nella Versione 2.5.

Se stai eseguendo questo codice all'interno di un file template, funzionerà perfettamente, ma se questo codice è in functions.php o in un file di plugin, genererà questo errore nel debug.log
:
PHP Notice: is_page è stato chiamato in modo errato. I tag condizionali di query non funzionano prima che la query venga eseguita. Prima di allora, restituiscono sempre false.
In questo caso, potresti usare l'hook di azione template_redirect
, come spiegato qui.

Non testato... ma qualcosa del genere dovrebbe funzionare per ottenere il nome (cioè lo slug) della pagina attualmente visualizzata:
function my_custom_tooltip() {
global $post;
if ( is_object( $post ) && $post->post_type=='page' ) {
if ( $post->post_name == $page_selected ) {
wp_enqueue_style( 'custom_tooltip_frontend_css', plugins_url('custom-image-tooltip/custom-image-tooltip.css') );
wp_enqueue_script( 'custom_tooltip_frontend_js', plugins_url('custom-image-tooltip/custom-image-tooltip.js'), array('jquery'), '', true );
}
}
}
Il confronto con $page_selected
ovviamente si aspetta che sia in formato "slug"... oppure se vuoi confrontare con il titolo della pagina puoi usare $post->post_title
invece di $post->post_name
.
Nota, questo è un esempio dove usare le classi PHP è utile, per evitare di dover usare una variabile globale ($page_selected
) all'interno di quella funzione...
