Come caricare JS e CSS solo su pagine specifiche usando is_page()?

5 gen 2016, 18:52:07
Visualizzazioni: 47.4K
Voti: 11

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?

5
Commenti

is_page() accetta variabili come parametro. Infatti, puoi usare variabili come parametro per qualsiasi funzione PHP che accetti parametri. Perché dici che non è così? Dovrebbe funzionare se passi il valore corretto nella variabile. Penso che il problema sia che la variabile non ha il valore che credi tu abbia.

cybmeta cybmeta
5 gen 2016 19:20:34

Ho provato a memorizzare in una variabile PHP il Titolo della Pagina o lo Slug della Pagina (es. $my_page_id = 'about';) e poi usare quella variabile come parametro di is_page(), ma non ha funzionato. Nel codex di WP ho scoperto che is_page() accetta come parametri l'ID della Pagina, il Titolo della Pagina o lo Slug della Pagina. Sono nuovo in PHP e WP e pensavo che ciò significasse che si potessero passare solo stringhe o interi come parametro della funzione is_page(). Ho corretto il mio post per evitare di fornire informazioni fuorvianti ad altri utenti.

RaymondMik RaymondMik
6 gen 2016 11:40:49

puoi mostrare un var_dump($page_selected)

WPTC-Troop WPTC-Troop
6 gen 2016 11:56:22

Ora penso che la tua domanda non riguardi il tuo vero problema. Credo che tu abbia bisogno di sapere come ottenere il valore impostato nel modulo del plugin. Ho notato che la variabile $page_selected non è definita nel tuo codice. Puoi mostrarci come hai costruito il modulo nell'area di amministrazione e come memorizzi i valori impostati in quel modulo?

cybmeta cybmeta
6 gen 2016 12:12:02

Ecco come ho costruito il mio modulo nell'area di amministrazione: <select name="page_dropdown"> <option value=""><?php echo esc_attr( __( 'Seleziona pagina' ) ); ?</option> <?php $pages = get_pages(); foreach ( $pages as $page ) { $option = '<option>'; $option.= $page->post_title; $option .= '</option>'; echo $option; } ?> </select> Supponiamo che selezioni "test_page_1" nel mio modulo - var_dump($page_selected) = string(11) "test_page_1";

RaymondMik RaymondMik
6 gen 2016 12:32:03
Tutte le risposte alla domanda 4
0
10

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.

5 gen 2016 19:19:24
1

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.

9 gen 2016 13:13:14
Commenti

Per funzionare correttamente, gli script devono essere accodati al momento giusto durante il caricamento della pagina. Se vengono caricati troppo tardi potrebbero non funzionare affatto. Quindi è necessario agganciarli all'azione wp_enqueue_scripts.

AddWeb Solution Pvt Ltd AddWeb Solution Pvt Ltd
9 gen 2016 15:00:40
0

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.

18 set 2017 03:32:13
0

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...

5 gen 2016 19:21:29