tener un enigma interesante. Necesito cargar alrededor de 8 archivos javascript y la misma cantidad de estilos para mi complemento. Estos solo son necesarios donde se ejecute mi shortcode.
Intenté cargarlos con print_styles y print_scripts, pero no se representan correctamente, además, al hacerlo, se rompe la validación de xhtml. Entonces, en este momento se cargan en cada página y, debido a la cantidad de archivos necesarios, no es factible dejarlo así.
En otro proyecto, escribí una función en el archivo index.php de mi complemento que tomaría la página actual, buscaría mi código abreviado y, si lo encontraba, solo imprimiría los scripts, pero este es un truco feo.
¿Alguien tiene alguna sugerencia o solución? cualquier ayuda sería apreciada, saludos, Daithi
para responder a mi propia pregunta… Lo hice escribir la primera vez. Tienes que buscar en cada página para comprobar que se está utilizando tu shortcode. Esto debe hacerse cuando se cargan los datos de la página y antes de que se muestre la página. Para mí, es una completa exageración en el sistema, pero desafortunadamente es así. Obtuve esta información de:
get_shortcode_regex
y
viejo nabble
Así que primero:
add_action('template_redirect','wp_my_shortcode_head');
después:
function wp_my_shortcode_head(){
global $posts;
$pattern = get_shortcode_regex();
preg_match("https://stackoverflow.com/".$pattern.'/s', $posts[0]->post_content, $matches);
if (is_array($matches) && $matches[2] == 'YOURSHORTCODE') {
//shortcode is being used
}
}
reemplace ‘YOURSHORTCODE’ con el nombre de su shortcode y agregue sus wp_enqueue_scripts donde dice //shortcode se está utilizando.
-
Genial, esto te será muy útil. Todos estos complementos agregan tantos scripts… Por cierto, ¿es mejor preguntar en stackoverflow que en wordpress.stackexchange?
– huyz
5 de julio de 2011 a las 14:33
-
Podrías usar
strstr()
ostrpos()
en lugar de expresiones regulares para encontrar su shortcode… El página man para preg_match diceDo not use preg_match() if you only want to check if one string is contained in another string. Use strpos() or strstr() instead as they will be faster.
– ComandoZ
21 de febrero de 2014 a las 18:16
-
Pero si hubiera argumentos para el shortcode, entonces no funcionaría. No lo pensé bien…
– ComandoZ
21 de febrero de 2014 a las 20:18
catalín
Leí una solución aquí: http://scribu.net/wordpress/condicional-script-loading-revisited.html
Básicamente, si usa wordpress 3.3, puede poner en cola sus scripts en su función de código corto.
function my_shortcode($atts){
wp_enqueue_script( 'my-script', plugins_url( 'plugin_name/js/script.js' ), array('jquery'), NULL, true);
// if you add a css it will be added to the footer
//wp_enqueue_style( 'my-css', plugins_url( 'plugin_name/css/style.css' ) );
//the rest of shortcode functionality
}
-
Esto no incluirá la hoja de estilo ya que el shortcode se llama demasiado tarde en la carga de la página para hacerlo. Sin embargo, agregará los scripts al pie de página. En el ejemplo que dio Scribu, específicamente solo mostró los guiones.
– ComandoZ
21 de febrero de 2014 a las 3:43
-
Tienes razón… me preguntaba por qué mi archivo css está en el pie de página… gracias por comentar.
– Catalín
21 de febrero de 2014 a las 17:42
-
Sin embargo, trabajé en una forma de hacer esto. Obtengo las páginas en las que está el shortcode usando el
save_posts
enganche y guarde esas páginas como una matriz de opciones y luego todo lo que tengo que hacer esget_option
y verifique si page_id esin_array
para imprimir los estilos y scripts o no. De esa manera, no tiene que analizar todas las publicaciones cada vez solo cuando guarda una publicación que no es una revisión.– ComandoZ
21 de febrero de 2014 a las 18:15
-
Me gusta tu respuesta de arriba, pero tengo un “fallo”. Hice un cuadro meta para las páginas donde puse un código abreviado que requiere un archivo js y css, y hago una salida en un encabezado, así que… tu respuesta no funciona porque busca solo el contenido, pero ¿qué pasa si uso en una barra lateral el código abreviado?… ¿hay formas de hacer que su código funcione en esas situaciones?
– Catalín
31 de marzo de 2014 a las 9:27
ComandoZ
Cargar secuencias de comandos y estilos de forma dinámica por página mediante un código abreviado
Ventajas
- No busca en todas las publicaciones cada vez que se llama al shortcode.
- Capaz de agregar estilos y scripts dinámicamente solo cuando el código corto está en la página.
- No usa expresiones regulares ya que tienden a ser más lentas que
strstr()
ostrpos()
. Si necesita recoger argumentos, debe usar la expresión regular de código abreviado mencionada anteriormente. - Reduce las llamadas de archivo
Explicación del Código
-
Encuentra los códigos cortos en la página usando el
save_post
gancho solo cuando la publicación no es una revisión y coincide con la especificadapost_type
. -
Guarda los ID de publicación encontrados como una matriz usando
add_option()
con carga automática establecida en sí a menos que la entrada ya esté presente. Entonces se usaráupdate_option()
. -
usa gancho
wp_enqueue_scripts
llamar a nuestroadd_scripts_and_styles()
función. -
Esa función entonces llama
get_option()
para recuperar nuestra matriz de ID de página. si la corriente$page_id
está en el$option_id_array
luego agrega los scripts y estilos.
Tenga en cuenta: Convertí el código de las clases de espacio de nombres OOP, por lo que es posible que me haya perdido algo. Déjame saber en los comentarios si lo hice.
Ejemplo de código: encontrar ocurrencias de código abreviado
function find_shortcode_occurences($shortcode, $post_type="page")
{
$found_ids = array();
$args = array(
'post_type' => $post_type,
'post_status' => 'publish',
'posts_per_page' => -1,
);
$query_result = new WP_Query($args);
foreach ($query_result->posts as $post) {
if (false !== strpos($post->post_content, $shortcode)) {
$found_ids[] = $post->ID;
}
}
return $found_ids;
}
function save_option_shortcode_post_id_array( $post_id )
{
if ( wp_is_post_revision( $post_id ) OR 'page' != get_post_type( $post_id )) {
return;
}
$option_name="yourprefix-yourshortcode";
$id_array = find_shortcode_occurences($option_name);
$autoload = 'yes';
if (false == add_option($option_name, $id_array, '', $autoload)) update_option($option_name, $id_array);
}
add_action('save_post', 'save_option_shortcode_id_array' );
Ejemplo de código: Shortcode incluye secuencias de comandos y estilos de forma dinámica
function yourshortcode_add_scripts_and_styles() {
$page_id = get_the_ID();
$option_id_array = get_option('yourprefix-yourshortcode');
if (in_array($page_id, $option_id_array)) {
wp_enqueue_script( $handle, $src, $deps, $ver, $footer = true );
wp_enqueue_style( $handle, $src , $deps);
}
}
add_action('wp_enqueue_scripts', 'yourshortcode_add_scripts_and_styles');
-
Definitivamente mejor que buscar en cada publicación;)
– Daithí
26 de febrero de 2014 a las 15:06
-
@Coombesy ¡Gracias! He estado usando esto en mis propios complementos (solo en el entorno de clase/espacio de nombres) y ha funcionado bien. Me gustaría que pusieran algo como esto en el núcleo. No hay ninguna razón por la que no puedan mantener una lista de páginas en las que se encuentra el código abreviado y luego solo incluir los scripts y estilos si están en esas páginas. En cambio, obtenemos una gran cantidad de scripts y estilos si usa muchos complementos. Loca.
– ComandoZ
26 de febrero de 2014 a las 15:29
Solo lee este tutorial aquí: http://scribu.net/wordpress/optimal-script-loading.html
Parece ser la mejor manera.
add_action('init', 'register_my_script');
add_action('wp_footer', 'print_my_script');
function register_my_script() {
wp_register_script('my-script', plugins_url('my-script.js', __FILE__), array('jquery'), '1.0', true);
}
function print_my_script() {
global $add_my_script;
if ( ! $add_my_script )
return;
wp_print_scripts('my-script');
}
En este caso, el script se pondrá en cola solo si $add_my_script global se configuró en algún momento durante la representación de la página.
add_shortcode('myshortcode', 'my_shortcode_handler');
function my_shortcode_handler($atts) {
global $add_my_script;
$add_my_script = true;
// actual shortcode handling here
}
Entonces, el script se agregará si [myshortcode …] se encontró en cualquiera de las publicaciones en la página actual.
Cargue secuencias de comandos y estilos si la publicación/página tiene un código corto
La mejor solución es cargar los archivos en el encabezado de la página si, y solo si, la publicación o página actual tiene el código corto dentro de su contenido. Y eso es exactamente lo que hace la siguiente función:
function flip_register_frontend_assets()
{
//Registra tus scripts y estilos aquí
wp_register_style('pp_font','plugin_styles.css', null, null, 'all');
global $post;
// comprueba si tu contenido tiene shortcode
if(isset($post->post_content) && has_shortcode( $post->post_content, 'your-
shortcode')){
// Ponga en cola sus scripts y estilos aquí
wp_enqueue_style( 'pp_font');
}
}
Simplemente coloque esta función dentro de uno de sus archivos de complemento y estará listo para comenzar. Tendrás que reemplazar [your-shortcode] con el código corto que desea buscar, y también deberá reemplazar plugin_styles.css con el nombre de su hoja de estilo.
Angrej Kumar
Simplemente puede usar este código para verificar si el código abreviado se implementa en el contenido de la página o en los widgets de la barra lateral.
<?php
if ( shortcode_exists( 'gallery' ) ) {
// The short code exists.
}
?>
Amin Safsafi
Uso la versión 5.4 de WordPress con el estilo de código OOP. No sé si esto afecta por qué ninguna de las soluciones anteriores no funcionó para mí, así que se me ocurrió esta solución:
public function enqueue_scripts() {
global $post;
//error_log( print_r( $post, true ) );
//error_log( print_r( $post->post_content, true ) );
//error_log( print_r( strpos($post->post_content, '[YOUR_SHORTCODE]'),true));
if ( is_a( $post, 'WP_Post' ) && strpos($post->post_content, '[YOUR_SHORTCODE]') )
{
wp_register_style('my-css', $_css_url);
wp_register_script('my-js', $_js_url);
}
}
Espero que esto ayude a alguien.