특정 단축 코드 또는 위젯이있는 경우에만 스크립트로드


17

페이지 / 포스트 컨텐츠를로드하기 전에 필터링하여 특정 단축 코드가있는 경우 헤더에 스크립트를 추가 할 수있는 방법이 필요했습니다. 많은 검색 후 나는 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');

그것은 절대적으로 훌륭하고 내가 필요한 것을 정확하게했습니다.

이제 조금 더 확장하고 사이드 바에 대해서도 동일하게 수행해야합니다. 특정 위젯 유형, 단축 코드, 코드 스 니펫 또는 스크립트를로드해야 할시기를 식별하는 데 사용되는 기타 유형일 수 있습니다.

문제는 사이드 바가로드되기 전에 사이드 바 내용에 액세스하는 방법을 알 수 없다는 것입니다 (문제의 테마에는 여러 사이드 바가 있음)


상황에 맞는 헤더의 스크립트가 필요한가요? 페이지 끝의 스크립트는 성능에 대한 조건부 및 권장 방법을 다루기가 더 쉽습니다.
Rarst

먼저 wp_footer에서 시도해 보았으므로 내용을 사전 필터링 할 필요가 없었지만 스크립트가 정상적으로로드되었지만 작동하지 않았습니다. 이러한 스크립트는 필요한 것을 수행하기 위해 wp_head에 있어야합니다.
Ashley G

답변:


20

is_active_widget 함수를 사용할 수 있습니다 . 예 :

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

add_action( 'init', 'check_widget' );

위젯이로드 된 페이지에만 스크립트를로드하려면 위젯 클래스에 is_active_widget () 코드를 추가해야합니다. 예를 들어, 기본 최근 댓글 위젯 (wp-includes / default-widgets.php, 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') );
    }

위젯이로드되기 전에 호출 될 수 있습니다. 페이지를로드하기 전에이 작업을 수행해야합니다. 내 샘플 코드는 the_posts를 사용하여 페이지의 내용을 필터링하지만 사이드 바 / 위젯을 얻지 못합니다.
Ashley G

예, 답변에 추가 한 예를 참조하십시오.
sorich87

귀하의 예는 실제로 작동하지 않습니다. 나는 분명한 것을 놓치고 있습니까?
Ashley G

실제로 나는 있었다. wp_enqueue_script는 wp_head에 적용될 때 작동하지 않는 것 같지만 wp_print_scripts는 작동합니다. wp_enqueue_script는 다음과 같이 초기화에 적용되면 작동합니다. add_action ( 'init', 'check_widget');
Ashley G

그러나 위젯이 하나의 사이드 바에서만 활성화 된 경우에도 사이트의 모든 페이지에 스크립트를로드합니다. 예를 들어 블로그 페이지에 대한 사이드 바가 있고 다른 페이지에 대한 다른 사이드 바가있는 경우. 블로그 사이드 바에 검색 위젯을 추가하면 스크립트가로드되지만 블로그 사이드 바가없는 페이지에서도로드됩니다. 위젯이 해당 페이지에있는 경우에만 스크립트를로드 할 수 있어야합니다.
Ashley G

3

내가 작업 한 솔루션을 공유하고 싶었고 구현에 조금 더 다목적으로 사용할 수있었습니다. 함수는 다양한 단축 코드를 검사하지 않고 대기열에 포함되어야하는 스크립트 / 스타일 함수를 참조하는 단일 단축 코드를 찾도록 수정했습니다. 이것은 다른 클래스의 메소드 (예 : 자체 플러그인이 아닌 플러그인)와 범위 내 함수 모두에서 작동합니다. functions.php에 아래 코드를 드롭하고 특정 CSS 및 JS를 원하는 페이지 / 게시물에 다음 구문을 추가하십시오.

페이지 / 포스트 구문 : [loadCSSandJS function = "(class-> method / function name)"]

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

또한 페이지에 원하는만큼 추가 할 수 있습니다. 로드하려면 메소드 / 함수가 필요하다는 것을 명심하십시오.


1

이 팁을 공유해 주셔서 감사합니다! 처음에는 작동하지 않았기 때문에 약간의 두통이 생겼습니다. 위의 코드에는 몇 가지 실수 (아마도 오타)가 있다고 생각하고 다음 has_my_shortcode과 같이 함수를 다시 작성했습니다.

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

나는 두 가지 주요 문제가 있다고 생각 break합니다. 다른 문제는 더 미묘하고 찾기가 어려웠습니다. 짧은 코드가 게시물에 가장 먼저 작성된 경우 위의 코드가 작동하지 않습니다. ===이 문제를 해결하기 위해 연산자 를 사용해야 했습니다.

어쨌든,이 기술을 공유해 주셔서 대단히 감사합니다. 많은 도움이되었습니다.


1

Wordpress 4.7에는 functions.php파일 에서 이것을 달성하는 또 다른 방법이 있습니다.

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

먼저 스크립트등록 하십시오. 짧은 코드가 호출되면 대기열에 넣지 않으면 실제로 페이지에 인쇄되지 않습니다.

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

이 문서 do_shortcode_tagWP 4.7도입되었으며 새로운 개발자 문서 페이지 에서 찾을 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.