กำลังโหลดสคริปต์เฉพาะเมื่อมีรหัสย่อหรือวิดเจ็ตเฉพาะ


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-include / 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 ใช้งานได้หากใช้กับ init เช่น: add_action ('init', 'check_widget');
Ashley G

อย่างไรก็ตามจะโหลดสคริปต์ในทุกหน้าของไซต์แม้ว่าวิดเจ็ตจะทำงานในแถบด้านข้างเดียวเท่านั้น ตัวอย่างเช่นถ้าฉันมีแถบด้านข้างสำหรับหน้าบล็อกและอีกแถบด้านข้างสำหรับหน้าอื่น ๆ ฉันเพิ่มวิดเจ็ตการค้นหาในแถบด้านข้างของบล็อกและสคริปต์จะโหลด แต่ก็ยังโหลดในหน้าเว็บที่ไม่มีแถบด้านข้างของบล็อก ฉันต้องสามารถโหลดสคริปต์เฉพาะเมื่อมีวิดเจ็ตอยู่ในหน้านั้น
Ashley G

3

แค่ต้องการแบ่งปันวิธีแก้ปัญหาที่ฉันทำงานซึ่งทำให้ฉันมีความหลากหลายมากขึ้นในการใช้งานของฉัน แทนที่จะมีการตรวจสอบฟังก์ชั่นสำหรับรหัสย่อที่หลากหลายฉันปรับเปลี่ยนเพื่อค้นหารหัสย่อเดียวที่อ้างอิงฟังก์ชันสคริปต์ / สไตล์ที่ต้องลงทะเบียน สิ่งนี้จะใช้ได้กับทั้งสองวิธีในคลาสอื่น ๆ (เช่นปลั๊กอินที่อาจทำไม่ได้) และฟังก์ชันที่อยู่ในขอบเขต เพียงแค่วางรหัสด้านล่างใน functions.php และเพิ่มไวยากรณ์ต่อไปนี้ไปยังหน้า / โพสต์ใด ๆ ที่คุณต้องการ CSS & JS เฉพาะ

ไวยากรณ์ของเพจ / โพสต์: [loadCSSandJS function = "(class-> method / ชื่อฟังก์ชั่น)"]

รหัส function.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ไม่อยู่ในขอบเขตของคำสั่ง if และนั่นทำให้การวนซ้ำมักจะทำซ้ำครั้งแรก ปัญหาอื่น ๆ นั้นลึกซึ้งและยากต่อการค้นพบ รหัสด้านบนใช้ไม่ได้หากรหัสย่อเป็นสิ่งแรกที่เขียนในโพสต์ ฉันต้องใช้===โอเปอเรเตอร์เพื่อแก้ปัญหานี้

อย่างไรก็ตามขอบคุณมากสำหรับการแบ่งปันเทคนิคนี้มันช่วยได้มาก


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

the do_shortcode_tagถูกนำมาใช้ใน WP 4.7และสามารถพบได้ในหน้าเอกสารของนักพัฒนาใหม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.