Cargando scripts solo si hay un shortcode o widget en particular presente

15

Necesitaba una forma de filtrar el contenido de una página / publicaciones antes de que se cargara para poder agregar scripts al encabezado si hubiera un shortcode específico. Después de mucho buscar encontré esto en enlace

function has_my_shortcode($posts) {
    if ( empty($posts) )
        return $posts;

    $found = false;

    foreach ($posts as $post) {
        if ( stripos($post->post_content, '[my_shortcode') )
            $found = true;
            break;
        }

    if ($found){
        $urljs = get_bloginfo( 'template_directory' ).IMP_JS;

    wp_register_script('my_script', $urljs.'myscript.js' );

    wp_print_scripts('my_script');
}
    return $posts;
}
add_action('the_posts', 'has_my_shortcode');

que es absolutamente brillante e hizo exactamente lo que necesitaba.

Ahora necesito extenderlo un poco más y hacer lo mismo para las barras laterales. Puede ser por un tipo de widget particular, código corto, fragmento de código o cualquier otra cosa que funcione para identificar cuándo se necesita cargar el script.

El problema es que no puedo averiguar cómo acceder al contenido de las barras laterales antes de que se cargue la barra lateral (el tema en cuestión tendrá varias barras laterales)

    
pregunta Ashley G 28.09.2010 - 10:21

4 respuestas

19

Puede utilizar la función is_active_widget . Por ejemplo:

function check_widget() {
    if( is_active_widget( '', '', 'search' ) ) { // check if search widget is used
        wp_enqueue_script('my-script');
    }
}

add_action( 'init', 'check_widget' );

Para cargar el script en la página en la que solo se carga el widget, deberá agregar el código is_active_widget () en su clase de widget. Por ejemplo, consulte el widget de comentarios recientes predeterminado (wp-includes / default-widgets.php, línea 602):

class WP_Widget_Recent_Comments extends WP_Widget {

    function WP_Widget_Recent_Comments() {
        $widget_ops = array('classname' => 'widget_recent_comments', 'description' => __( 'The most recent comments' ) );
        $this->WP_Widget('recent-comments', __('Recent Comments'), $widget_ops);
        $this->alt_option_name = 'widget_recent_comments';

        if ( is_active_widget(false, false, $this->id_base) )
            add_action( 'wp_head', array(&$this, 'recent_comments_style') );

        add_action( 'comment_post', array(&$this, 'flush_widget_cache') );
        add_action( 'transition_comment_status', array(&$this, 'flush_widget_cache') );
    }
    
respondido por el sorich87 28.09.2010 - 11:03
3

Solo quería compartir una solución en la que trabajé, lo que me permitió ser un poco más versátil con mi implementación. En lugar de hacer que la función compruebe una variedad de códigos cortos, lo modifiqué para buscar un único código breve que haga referencia a una función de estilo / secuencia de comandos que deba ser puesta en cola. Esto funcionará para ambos métodos en otras clases (como complementos que pueden no hacerlo ellos mismos) y funciones en el alcance. Simplemente suelte el siguiente código en functions.php y agregue la siguiente sintaxis a cualquier página / publicación en la que desee CSS & JS.

Sintaxis de página / publicación: [loadCSSandJS function="(class- > method / function name)"]

código de functions.php:

function page_specific_CSSandJS( $posts ) {
  if ( empty( $posts ) )
    return $posts;

  foreach ($posts as $post) {

    $returnValue = preg_match_all('#\[loadCSSandJS function="([A-z\-\>]+)"\]#i', $post->post_content, $types);

    foreach($types[1] as $type) {
      $items = explode("->",$type);
      if (count($items) == 2) {
        global $$items[0];      
        if( method_exists( $$items[0], $items[1] ))
          add_action( 'wp_enqueue_scripts', array(&$$items[0], $items[1]) );
      }
      else if( !empty( $type ) && function_exists( $type ))
        add_action( 'wp_enqueue_scripts', $type );
    }
  }

  return $posts;
}

Esto también le permitirá agregar tantos como desee en una página. Tenga en cuenta que necesita un método / función para cargar.

    
respondido por el Nick Caporin 26.09.2012 - 00:14
1

¡Gracias por compartir este consejo! Me dio un poco de dolor de cabeza, porque al principio no estaba funcionando. Creo que hay un par de errores (tal vez errores tipográficos) en el código arriba de has_my_shortcode y reescribí la función como se muestra a continuación:

function has_my_shortcode( $posts ) {

        if ( empty($posts) )
            return $posts;

        $shortcode_found = false;

        foreach ($posts as $post) {

            if ( !( stripos($post->post_content, '[my-shortcode') === false ) ) {
                $shortcode_found = true;
                break;
            }
        }

        if ( $shortcode_found ) {
            $this->add_scripts();
            $this->add_styles();
        }
        return $posts;
    }

Creo que hubo dos problemas principales: el break no estaba en el alcance de la sentencia if, y eso causó que el bucle se rompiera siempre en la primera iteración. El otro problema era más sutil y difícil de descubrir. El código anterior no funciona si el código corto es lo primero que se escribe en una publicación. Tuve que usar el operador === para resolver esto.

De todos modos, muchas gracias por compartir esta técnica, me ayudó mucho.

    
respondido por el jekbau 22.12.2011 - 10:48
1

con Wordpress 4.7 hay otra forma de lograr esto en su archivo functions.php ,

add_action( 'wp_enqueue_scripts', 'register_my_script');
function register_my_script(){
  wp_register_script('my-shortcode-js',$src, $dependency, $version, $inFooter);
}

primero registra tu script , que en realidad no se imprime en tu página a menos que lo pongas en cola Si tu shortcode es llamado,

add_filter( 'do_shortcode_tag','enqueue_my_script',10,3);
function enqueue_my_script($output, $tag, $attr){
  if('myShortcode' != $tag){ //make sure it is the right shortcode
    return $output;
  }
  if(!isset($attr['id'])){ //you can even check for specific attributes
    return $output;
  }
  wp_enqueue_script('my-shortcode-js'); //enqueue your script for printing
  return $output;
}

el do_shortcode_tag fue introducido en WP 4.7 y se puede encontrar en nuevas páginas de documentación de desarrolladores .

    
respondido por el Aurovrata 31.01.2017 - 06:33

Lea otras preguntas en las etiquetas