특정 단축 코드 또는 위젯이있는 경우에만 스크립트로드
-
-
헤더의 스크립트가 귀하의 상황에 맞습니까?페이지 끝에있는 스크립트는 조건부로 처리하기 쉽고 성능을 위해 권장되는 방법입니다.Are scripts in header hard requirement for your situation? Scripts at end of page are easier to deal with conditionally and recommended practice for performance.
- 0
- 2010-09-28
- Rarst
-
콘텐츠를 사전 필터링 할 필요가없는 wp_footer에서 먼저 시도했지만 스크립트가 제대로로드되는 동안 작동하지 않았습니다.이 스크립트는 필요한 작업을 수행하기 위해 wp_head에 있어야합니다.I did try it in wp_footer first which nicely eliminates the need for prefiltering the content, but while the scripts loaded fine, they didn't work. These scripts have to be in wp_head to do what they need to.
- 0
- 2010-09-28
- Ashley G
-
4 대답
- 투표
-
- 2010-09-28
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') ); }
You can use the function is_active_widget . E.g.:
function check_widget() { if( is_active_widget( '', '', 'search' ) ) { // check if search widget is used wp_enqueue_script('my-script'); } } add_action( 'init', 'check_widget' );
To load the script in the page where the widget is loaded only, you will have to add the is_active_widget() code, in you widget class. E.g., see the default recent comments widget (wp-includes/default-widgets.php, line 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를 사용하여 페이지의 콘텐츠를 필터링하지만 사이드 바/위젯을 가져 오지 않습니다.Can that be called BEFORE the widgets are loaded. To be clear this has to take place before the page even loads. My sample code uses the_posts to filter the content on the page, but that doesn't get the sidebars/widgets.
- 0
- 2010-09-28
- Ashley G
-
예,내 답변에 추가 한 예를 참조하십시오.Yes, see the example I added to my answer.
- 0
- 2010-09-28
- sorich87
-
귀하의 예는 실제로 작동하지 않습니다.나는 명백한 것을 놓치고 있습니까?Your example doesn't actually work. Am I missing something obvious?
- 0
- 2010-09-29
- Ashley G
-
사실 나는 그랬다.wp_enqueue_script는 wp_head에 적용될 때 작동하지 않는 것 같지만 wp_print_scripts는 작동합니다.wp_enqueue_script는 다음과 같이init에 적용하면 작동합니다. add_action ( 'init','check_widget');Actually I was. wp_enqueue_script doesn't seem to work when applied to wp_head, but wp_print_scripts does. wp_enqueue_script does work though if applied to init like so: add_action( 'init', 'check_widget' );
- 0
- 2010-09-29
- Ashley G
-
그러나 위젯이 하나의 사이드 바에서만 활성화되어 있더라도 사이트의 모든 페이지에 스크립트를로드합니다.예를 들어 블로그 페이지 용 사이드 바와 다른 페이지 용 사이드 바가 있습니다.블로그 사이드 바에 검색 위젯을 추가하면 스크립트가로드되지만 블로그 사이드 바가없는 페이지에서도로드됩니다.해당 페이지에 위젯이있는 경우에만 스크립트를로드 할 수 있어야합니다.However it loads the scripts on every page of the site, even if the widget is only active in one sidebar. for example if I have a sidebar for blog pages and a another sidebar for other pages. I add the search widget to the blog sidebar and the scripts does load, but it also loads on pages that don't have the blog sidebar. I need to be able to load the script only if the widget is present on that page.
- 0
- 2010-09-29
- Ashley G
-
내 대답을 수정했습니다.I edited my answer
- 0
- 2010-09-29
- sorich87
-
당신은 남자입니다!건배!You are the man! Cheers!
- 0
- 2010-09-29
- Ashley G
-
아주 좋은 해결책 :)Very nice solution :)
- 0
- 2011-12-25
- Anh Tran
-
wp_head 대신 wp_enqueue_scripts를 사용하는 것이 좋습니다.좋은 대답,감사합니다.Better to use wp_enqueue_scripts instead of wp_head. great answer, thank you.
- 0
- 2017-03-06
- wesamly
-
- 2012-09-25
그냥 제가 작업 한 솔루션을 공유하고 싶었습니다.이 솔루션을 통해 구현에 대해 좀 더 다재다능하게 할 수있었습니다. 함수에서 다양한 단축 코드를 확인하는 대신 대기열에 넣어야하는 스크립트/스타일 함수를 참조하는 단일 단축 코드를 찾도록 수정했습니다. 이는 다른 클래스 (예 : 자체적으로 수행 할 수없는 플러그인)의 메서드와 범위 내 함수 모두에서 작동합니다.functions.php에 아래 코드를 드롭하고 특정 CSS를 원하는 페이지/게시물에 다음 구문을 추가하기 만하면됩니다. JS.
페이지/포스트 구문 : [loadCSSandJSfunction="(class->method/functionname)"]
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; }
또한 페이지에 원하는만큼 추가 할 수 있습니다. 로드하려면 메소드/함수가 필요합니다.
Just wanted to share a solution I worked on which allowed me to be a bit more versatile with my implementation. Rather than having the function check for a variety of shortcodes, I modified it to seek out a single shortcode that references a script/style function that needs to be enqueued. This will work for both methods in other classes (such as plugins that may not do this themselves) and in-scope functions. Just drop the below code in functions.php and add the following syntax to any page/post where you want specific CSS & JS.
Page/Post Syntax: [loadCSSandJS function="(class->method/function name)"]
functions.php code:
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; }
This will also allow you to add as many as you want on a page. Keep in mind that you do need a method/function to load.
-
- 2011-12-22
이 팁을 공유해 주셔서 감사합니다! 처음에는 작동하지 않았기 때문에 약간의 두통이 생겼습니다.
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
는if 문의 범위에 없었고 이로 인해 루프가 항상 첫 번째 반복에서 중단되었습니다. 다른 문제는 더 미묘하고 발견하기 어려웠습니다. 위의 코드는 숏 코드가 게시물에서 가장 먼저 작성된 경우 작동하지 않습니다. 이 문제를 해결하려면===
연산자를 사용해야했습니다.어쨌든이 기술을 공유해 주셔서 감사합니다. 많은 도움이되었습니다.
Thank you for sharing this tip! It gave me a little headache, because at first it wasn't working. I think there are a couple of mistakes (maybe typos) in the code above
has_my_shortcode
and I re-written the function as below: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; }
I think there were two main issues: the
break
wasn't in the scope of the if statement, and that caused the loop to always break at the first iteration. The other problem was more subtle and difficult to discover. The code above doesn't work if the shortcode is the very first thing written in a post. I had to use the===
operator to solve this.Anyway, thank you so much for sharing this technique, it helped a lot.
-
- 2017-01-31
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_tag
는 WP 4.7에 도입 되었으며 새 개발자 문서 페이지에서 찾을 수 있습니다.with Wordpress 4.7 there is another way to achieve this in your
functions.php
file,add_action( 'wp_enqueue_scripts', 'register_my_script'); function register_my_script(){ wp_register_script('my-shortcode-js',$src, $dependency, $version, $inFooter); }
first you register your script, which doesn't actually get printed on your page unless your enqueue it if your shortcode is called,
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; }
the
do_shortcode_tag
was introduced in WP 4.7 and can be found in the new developers documentation pages.
특정 단축 코드가있는 경우 헤더에 스크립트를 추가 할 수 있도록로드되기 전에 페이지/게시물 콘텐츠를 필터링하는 방법이 필요했습니다. 많은 검색 끝에 http://wpengineer.com
에서 이것을 발견했습니다.정말 훌륭하고 제가 필요한 것을 정확히했습니다.
이제 좀 더 확장하고 사이드 바에 대해서도 동일하게 수행해야합니다. 특정 위젯 유형,단축 코드,코드 스 니펫 또는 스크립트를로드해야하는시기를 식별하는 데 사용할 수있는 기타 항목 일 수 있습니다.
문제는 사이드 바가로드되기 전에 사이드 바 콘텐츠에 액세스하는 방법을 알 수 없다는 것입니다 (문제의 테마에는 여러 개의 사이드 바가 있습니다)