Carregando scripts apenas se um shortcode ou widget específico estiver presente

15

Eu precisava de uma maneira de filtrar um conteúdo de página / postagens antes que ele fosse carregado, para que eu pudesse adicionar scripts ao cabeçalho se um shortcode específico estivesse presente. Depois de muita pesquisa me deparei com isso em 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 é absolutamente brilhante e fez exatamente o que eu precisava.

Agora preciso estender um pouco mais e fazer o mesmo com as barras laterais. Pode ser por um determinado tipo de widget, shortcode, snippet de código ou qualquer outra coisa que funcione para identificar quando o script precisa ser carregado.

O problema é que não consigo descobrir como acessar o conteúdo das barras laterais antes que a barra lateral seja carregada (o tema em questão terá várias barras laterais)

    
por Ashley G 28.09.2010 / 10:21

4 respostas

19

Você pode usar a função is_active_widget . Por exemplo:

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 carregar o script na página em que o widget é carregado apenas, você terá que adicionar o código is_active_widget () na sua classe widget. Por exemplo, veja o widget de comentários recentes padrão (wp-includes / default-widgets.php, linha 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') );
    }
    
por sorich87 28.09.2010 / 11:03
3

Só queria compartilhar uma solução em que trabalhei, o que me permitiu ser um pouco mais versátil com minha implementação. Em vez de verificar a existência de uma variedade de códigos de acesso, modifiquei-a para procurar um único shortcode que faça referência a uma função de script / estilo que precise ser enfileirada. Isso funcionará para os dois métodos em outras classes (como plugins que podem não fazer isso sozinhos) e em funções no escopo. Basta soltar o código abaixo em functions.php e adicionar a seguinte sintaxe a qualquer página / postagem em que você deseja CSS & JS.

Sintaxe de página / postagem: [loadCSSandJS function="(nome de classe & método / função)"]

código 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;
}

Isso também permitirá adicionar quantos você quiser em uma página. Tenha em mente que você precisa de um método / função para carregar.

    
por Nick Caporin 26.09.2012 / 00:14
1

Obrigado por compartilhar esta dica! Isso me deu uma pequena dor de cabeça, porque no começo não estava funcionando. Eu acho que há alguns erros (talvez erros de digitação) no código acima de has_my_shortcode e eu reescrevi a função como abaixo:

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;
    }

Acho que havia dois problemas principais: o break não estava no escopo da instrução if, e isso fazia com que o loop sempre fosse interrompido na primeira iteração. O outro problema era mais sutil e difícil de descobrir. O código acima não funciona se o shortcode for a primeira coisa escrita em um post. Eu tive que usar o operador === para resolver isso.

De qualquer forma, muito obrigado por compartilhar essa técnica, ajudou muito.

    
por jekbau 22.12.2011 / 10:48
1

com o Wordpress 4.7 existe outra maneira de conseguir isso no seu arquivo functions.php ,

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

primeiro você registra seu script , que na verdade não é impresso em sua página, a menos que seu enfileire se o seu shortcode for chamado,

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;
}

o do_shortcode_tag foi introduzido no WP 4.7 e pode ser encontrado no novas documentações dos desenvolvedores .

    
por Aurovrata 31.01.2017 / 06:33