Carregando scripts somente se um código de acesso ou widget específico estiver presente


17

Eu precisava de uma maneira de filtrar o conteúdo de uma página / postagens antes de ser carregado, para poder adicionar scripts ao cabeçalho se um código de acesso específico estivesse presente. Depois de muita pesquisa, me deparei com isso em http://wpengineer.com

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 eu preciso estender um pouco mais e fazer o mesmo com as barras laterais. Pode ser por um tipo de widget específico, código de acesso, trecho 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)


Os scripts no cabeçalho são um requisito difícil para a sua situação? Os scripts no final da página são mais fáceis de lidar com a prática condicional e recomendada para desempenho.
Rarst 28/09

Eu tentei no wp_footer primeiro, o que elimina bem a necessidade de pré-filtrar o conteúdo, mas, embora os scripts tenham sido carregados corretamente, eles não funcionaram. Esses scripts precisam estar no wp_head para fazer o que precisam.
Ashley L

Respostas:


20

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ê precisará adicionar o código is_active_widget () na sua classe de 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') );
    }

Pode ser chamado ANTES de os widgets serem carregados. Para ficar claro, isso precisa ocorrer antes que a página seja carregada. Meu código de exemplo usa the_posts para filtrar o conteúdo da página, mas isso não recebe as barras laterais / widgets.
Ashley L

Sim, veja o exemplo que adicionei à minha resposta.
sorich87

Seu exemplo não funciona realmente. Estou perdendo algo óbvio?
Ashley L

Na verdade eu estava. O wp_enqueue_script parece não funcionar quando aplicado ao wp_head, mas o wp_print_scripts funciona. O wp_enqueue_script funciona se aplicado ao init da seguinte maneira: add_action ('init', 'check_widget');
Ashley L

No entanto, ele carrega os scripts em todas as páginas do site, mesmo que o widget esteja ativo apenas em uma barra lateral. por exemplo, se eu tiver uma barra lateral para páginas do blog e outra barra lateral para outras páginas. Eu adiciono o widget de pesquisa à barra lateral do blog e os scripts são carregados, mas também carregamos em páginas que não possuem a barra lateral do blog. Eu preciso ser capaz de carregar o script apenas se o widget estiver presente nessa página.
Ashley G

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 fazer com que a função verifique uma variedade de códigos de acesso, modifiquei-o para procurar um único código de acesso que faça referência a uma função de script / estilo que precisa ser enfileirada. Isso funcionará para os dois métodos de outras classes (como plug-ins que podem não fazer isso eles mesmos) e para as funções dentro do escopo. Basta soltar o código abaixo em functions.php e adicionar a seguinte sintaxe a qualquer página / post em que você queira CSS e JS específicos.

Sintaxe de página / postagem: [loadCSSandJS function = "(class-> method / function name)"]

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á que você adicione quantas você quiser em uma página. Lembre-se de que você precisa de um método / função para carregar.


1

Obrigado por compartilhar esta dica! Isso me deu um pouco de dor de cabeça, porque no começo não estava funcionando. Eu acho que existem alguns erros (talvez erros de digitação) no código acima has_my_shortcodee reescrevi a função da seguinte maneira:

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

Eu acho que havia dois problemas principais: o que breaknão estava no escopo da instrução if e isso fazia com que o loop sempre quebrasse na primeira iteração. O outro problema era mais sutil e difícil de descobrir. O código acima não funciona se o código de acesso 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.


1

com o Wordpress 4.7, há outra maneira de conseguir isso em seu functions.phparquivo,

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 você o enfileire se seu código de acesso 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_tagfoi introduzido em WP 4.7 e pode ser encontrado nos novos documentação desenvolvedores páginas.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.