¿Cómo cargar JS y CSS solo en páginas específicas usando is_page()?
Estoy construyendo mi primer plugin de WP, que debe cargar algunos archivos JS y CSS solo en páginas específicas seleccionadas a través de un formulario disponible en el área de administración del plugin. Una vez seleccionado en el formulario, el Título de la Página se almacena en la tabla wp_options de la base de datos, luego los datos se extraen en una variable llamada $page_selected. Para cargar archivos JS y CSS solo en las páginas seleccionadas en el formulario, quería usar la función is_page(), pasando la variable $page_selected como parámetro.
function my_custom_tooltip() {
if ( is_page($page_selected) ) {
// Cargar hoja de estilos CSS
wp_enqueue_style( 'custom_tooltip_frontend_css', plugins_url('custom-image-tooltip/custom-image-tooltip.css') );
// Cargar archivo JavaScript con dependencia de jQuery
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');
Desafortunadamente, en mi caso, esa declaración condicional no funciona correctamente. ¿Hay alguna manera de lograr el mismo resultado, haciendo coincidir la página seleccionada en el formulario por el usuario con la página actual que se está mostrando?

Si $page_selected
devuelve una cadena que contiene el título de la página, debería funcionar correctamente. Lo he probado y is_page()
acepta el título de la página, el ID de la página y el slug.
Si estás teniendo problemas, será mejor almacenar el ID de la página en la base de datos y usarlo con is_page()
.
Por favor, consulta https://codex.wordpress.org/Function_Reference/is_page para obtener más detalles sobre los posibles argumentos que se pueden pasar a esta sentencia condicional.

Hice algunos cambios bastante útiles y espero que esto te ayude bien. Prueba el siguiente código:
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');
}
Aquí, asegúrate acerca de $page_selected
.
NOTA: Siempre deberías encolar tus scripts en el archivo functions.php del tema - no en un archivo de plantilla. Los archivos de plantilla simplemente no son el lugar correcto 99.9% de las veces.
Puedes usar is_page()
de múltiples formas como:
// Cuando se está mostrando cualquier Página individual.
is_page();
// Cuando se está mostrando la Página 42 (ID).
is_page( 42 );
// Cuando se está mostrando la Página con un post_title de "Contacto".
is_page( 'Contacto' );
// Cuando se está mostrando la Página con un post_name (slug) de "sobre-mi".
is_page( 'sobre-mi' );
// Devuelve true cuando la Página mostrada es el ID 42, o el post_name "sobre-mi", o el post_title "Contacto".
is_page( array( 42, 'sobre-mi', 'Contacto' ) );
Nota: La capacidad de usar arrays fue añadida en la Versión 2.5.

Si estás ejecutando este código dentro de un archivo de plantilla, funcionará bien, pero si este código está en functions.php o en un archivo de plugin, generará este error en debug.log
:
PHP Notice: is_page fue llamado incorrectamente. Las etiquetas condicionales de consulta no funcionan antes de que se ejecute la consulta. Antes de eso, siempre devuelven false.
En este caso, podrías usar el hook de acción template_redirect
, como se explica aquí.

No probado... pero algo como esto debería funcionar para obtener el nombre (es decir, el slug) de la página que se está mostrando actualmente:
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 );
}
}
}
La comparación con $page_selected
por supuesto espera que esté en formato "slug"... o si se compara con el título de la página, se podría usar $post->post_title
en lugar de $post->post_name
.
Nota, este es un ejemplo donde usar clases PHP es útil, para evitar tener que usar una variable global ($page_selected
) dentro de esa función...
