การโหลด JavaScript / CSS แบบมีเงื่อนไขสำหรับรหัสย่อ


37

ฉันปล่อยปลั๊กอินที่สร้างรหัสย่อและต้องใช้ไฟล์ JavaScript และไฟล์ CSS เพื่อโหลดในหน้าใด ๆ ที่มีรหัสย่อนั้น ฉันทำได้เพียงโหลดสคริปต์ / สไตล์ในทุกหน้า แต่นั่นไม่ใช่วิธีปฏิบัติที่ดีที่สุด ฉันต้องการโหลดไฟล์บนหน้าเว็บที่เรียกรหัสย่อเท่านั้น ฉันพบสองวิธีในการทำเช่นนี้ แต่ทั้งคู่มีปัญหา

วิธีที่ 1ตั้งค่าสถานะเป็นจริงภายในฟังก์ชันตัวจัดการรหัสย่อและจากนั้นตรวจสอบค่าภายในการwp_footerเรียกกลับ หากเป็นจริงจะใช้wp_print_scripts()เพื่อโหลด JavaScript ปัญหานี้ก็คือว่ามันทำงานเฉพาะสำหรับ JavaScript และ CSS ไม่ได้เพราะ CSS ควรจะประกาศภายใน<head>ซึ่งคุณสามารถทำในช่วงต้นเบ็ดเหมือนหรือinitwp_head

วิธีที่ 2เริ่มทำงานตั้งแต่เช้าและ "ดูล่วงหน้า" เพื่อดูว่ามีรหัสย่อในเนื้อหาของหน้าปัจจุบันหรือไม่ ผมชอบวิธีการนี้ดีกว่าครั้งแรก do_shortcode()แต่ปัญหาที่เกิดขึ้นกับมันมันจะไม่ตรวจสอบว่าสายแม่แบบ

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

อัปเดต:ฉันได้รวมโซลูชันไว้ในปลั๊กอินแล้ว ถ้าใครอยากรู้อยากเห็นที่จะเห็นมันโป่งพองออกมาในสภาพแวดล้อมที่อยู่คุณสามารถดาวน์โหลดได้หรือเรียกดูมัน

อัปเดต 2:ในฐานะของ WordPress 3.3 ตอนนี้คุณสามารถโทรwp_enqueue_script()ภายในการโทรกลับด้วยรหัสย่อได้โดยตรงและไฟล์ JavaScript จะถูกเรียกภายในส่วนท้ายของเอกสาร ในทางเทคนิคนั้นเป็นไปได้สำหรับไฟล์ CSS เช่นกัน แต่ควรได้รับการพิจารณาว่าเป็นวิธีปฏิบัติที่ไม่ดีเนื่องจากการส่งออก CSS นอก<head>แท็กนั้นเป็นการละเมิดข้อกำหนดของ W3C สามารถเป็นกรณี FOUC และอาจบังคับให้เบราว์เซอร์แสดงหน้าซ้ำอีกครั้ง


ฉันเคยใช้วิธีที่ 1 ในอดีต โหลด JS สำหรับรหัสย่อในส่วนท้ายโหลด CSS สำหรับรหัสย่อในบรรทัด มันใช้งานได้ แต่แฮ็ค รอคอยที่จะได้ทางออกที่ดีกว่า
EAMann

ปัญหาหลักของอินไลน์ CSS คือมันยากที่จะแทนที่ด้วยสไตล์อื่น ๆ และไม่ใช้เมธอด wp_enqueue_styles ()
Ian Dunn

คุณมี css มากแค่ไหน?
mfields

จาวาสคริปต์มีกี่บรรทัด?
mfields

2
จาวาสคริปต์เป็นส่วนที่ง่าย วิธีที่ดีที่สุดในการทำเช่นนี้อยู่ภายใต้ "เจได" ที่นี่: scribu.net/wordpress/optimal-script-loading.html
mfields

คำตอบ:


11

จากประสบการณ์ของฉันเองฉันได้ใช้การผสมผสานระหว่างวิธีที่ 1 และ 2 - สถาปัตยกรรมและส่วนท้ายสคริปต์ของ 1 และเทคนิค 'ดูล่วงหน้า' ของ 2

สำหรับการมองไปข้างหน้า แต่ผมใช้ regex ในสถานที่ของstripos; ความชอบส่วนบุคคลเร็วขึ้นและสามารถตรวจสอบรหัสย่อที่มีรูปแบบไม่ถูกต้อง

preg_match( '#\[ *shortcode([^\]])*\]#i', $content );

หากคุณกังวลเกี่ยวกับผู้แต่งที่ใช้งานdo_shortcodeด้วยตนเองฉันจะเลือกที่จะแนะนำให้พวกเขาใช้การเรียกใช้การดำเนินการเพื่อจัดคิวสไตล์ที่คุณลงทะเบียนไว้ล่วงหน้าด้วยตนเอง

ปรับปรุง : สำหรับผู้เขียนขี้เกียจที่ไม่เคย RTFM ส่งข้อความเพื่อเน้นข้อผิดพลาดของวิธีการของพวกเขา;)

function my_shortcode()
{
    static $enqueued;
    if ( ! isset( $enqueued ) )
        $enqueued = wp_style_is( 'my_style', 'done' ); // cache it so we don't repeat if called over and over

    // do shortcode
    $output = '';

    if ( ! $enqueued )
        // you can output the message on first occurence only by wrapping it in the previous if
        $output .= <<<HTML
<p>Attention! You must enqueue the shortcode stylesheet yourself if calling <code>do_shortcode()</code> directly!</p>
<p>Use <code>wp_enqueue_style( 'my_style' );</code> before your <code>get_header()</code> call inside your template.</p>
HTML;

    return $output;
}

นั่นเป็นจุดที่ดี เป็นการดีที่ฉันต้องการให้ทำงานโดยที่พวกเขาไม่ต้องทำอะไรเพิ่มเติม - เพราะครึ่งเวลาที่พวกเขาอาจจะไม่อ่านคำถามที่พบบ่อยก่อนดังนั้นพวกเขาจะคิดว่ามันพัง - แต่ฉันอาจจะทำแบบนั้น ฉันสามารถลงทะเบียนสคริปต์ในทุกหน้า แต่จัดคิวพวกเขาเฉพาะเมื่อฉันตรวจพบรหัสย่อ จากนั้นผู้ใช้สามารถเชื่อมต่อเข้าสู่ init และเรียกใช้ฟังก์ชั่นเข้าคิวในเทมเพลตเฉพาะที่จำเป็นโดยสมมติว่ามันยังไม่สายเกินไปในการเรียกใช้งาน ณ จุดนั้น นอกจากนี้ WP ยังมี get_shortcode_regex () ในตัวด้วย
Ian Dunn

3
หากผู้ใช้มีความเชี่ยวชาญในการนำไปใช้งานdo_shortcode()จะไม่สมเหตุสมผลหรือไม่ที่จะสมมติว่าพวกเขามีความเชี่ยวชาญในการปฏิบัติตามคำแนะนำสำหรับการจัดคิวรหัสสไตล์
Chip Bennett

1
จริง แต่มันจะได้รับ regex สำหรับรหัสย่อทั้งหมดไม่ใช่ของคุณ;) "ฉันสามารถลงทะเบียนสคริปต์ในทุกหน้า" อาจเป็นวิธีที่ดีกว่าด้วย! หมายเหตุพวกเขาไม่จำเป็นที่จะขอเข้ามาเพียงที่ไหนมาก่อนinit wp_headสำหรับนักพัฒนาขี้เกียจตรวจสอบwp_style_is( 'my_style_handle', 'done' )ภายในรหัสย่อของคุณ หากเป็นเท็จให้พิมพ์ข้อผิดพลาดที่มองเห็นซึ่งบอกให้พวกเขาว่าจะต้องทำอย่างไร
TheDeadMedic

@ เรือ - ฉันไม่กังวลว่าพวกเขาไม่สามารถทำตามคำแนะนำเพียงว่าพวกเขาจะไม่ทราบว่าพวกเขาควรจะตั้งแต่ 99% ของเวลาที่คุณไม่จำเป็นต้องทำอะไรพิเศษ
Ian Dunn

1
@ ฉันคิดว่าการเพิ่มdo_shortcode()เทมเพลตมีอยู่แล้ว "ทำ [ไอเอ็นจี] บางสิ่งที่พิเศษ" - และผู้ใช้ที่จะทำสิ่งที่พิเศษจะรู้อยู่แล้วเกี่ยวกับความต้องการที่จะจัดให้มีสไตล์มิฉะนั้นจะเต็มใจ / มีแนวโน้มมากกว่า ทำตามคำแนะนำพิเศษ
Chip Bennett

8

ฉันช้าตอบคำถามนี้ แต่ตั้งแต่ Ian เริ่มหัวข้อนี้ในรายชื่อ wp-hackers วันนี้มันทำให้ฉันคิดว่ามันคุ้มค่าที่จะตอบโดยเฉพาะอย่างยิ่งเมื่อพิจารณาว่าฉันวางแผนที่จะเพิ่มคุณสมบัติดังกล่าวให้กับปลั๊กอินบางตัวที่ฉันทำงานอยู่

วิธีการพิจารณาคือตรวจสอบการโหลดหน้าแรกเพื่อดูว่าใช้รหัสย่อจริงหรือไม่จากนั้นให้บันทึกสถานะการใช้รหัสย่อลงในคีย์โพสต์เมตา นี่คือวิธี:

ทีละขั้นตอนวิธีการ

  1. ตั้งธง$shortcode_used'no'
  2. ในฟังก์ชั่นรหัสของตัวเองตั้งธง$shortcode_used'yes'
  3. ตั้งค่า'the_content'ลำดับความสำคัญเบ็ด12ซึ่งเป็นหลังจากที่มีการประมวลผล WordPress ย่อและตรวจสอบการโพสต์เมตาสำหรับใช้กุญแจ'' (ค่าจะถูกส่งคืนเมื่อไม่มีคีย์เมตาโพสต์สำหรับรหัสโพสต์)"_has_{$shortcode_name}_shortcode"''
  4. ใช้'save_post'เบ็ดเพื่อลบการโพสต์เมตาล้างธงถาวรสำหรับโพสต์ในกรณีที่ผู้ใช้เปลี่ยนการใช้รหัสย่อ
  5. นอกจากนี้ใน'save_post'เบ็ดที่ใช้wp_remote_request()ในการส่ง HTTP GET ที่ไม่ปิดกั้นไปยังความคิดเห็นของโพสต์ของตัวเองเพื่อทริกเกอร์การโหลดหน้าแรกและการตั้งค่าของธงถาวร
  6. สุดท้ายตั้ง'wp_print_styles'และตรวจสอบการโพสต์เมตาสำหรับมูลค่าของ'yes', 'no'หรือใช้กุญแจ'' "_has_{$shortcode_name}_shortcode"หากค่านั้น'no'ไม่ได้ให้บริการภายนอก หากมีค่า'yes'หรือ''ไปข้างหน้าและให้บริการภายนอก

และควรทำเช่นนั้น ฉันได้เขียนและทดสอบปลั๊กอินตัวอย่างเพื่อแสดงให้เห็นว่ามันทำงานอย่างไร

ตัวอย่างรหัสปลั๊กอิน

ปลั๊กอินจะปลุกด้วยรหัสย่อ[trigger-css]ซึ่งตั้งค่า<h2>องค์ประกอบบนหน้าเป็นสีขาว - แดง - แดงเพื่อให้คุณสามารถมองเห็นได้ง่าย มันถือว่าcssไดเรกทอรีย่อยที่มีstyle.cssไฟล์ด้วย CSS นี้อยู่ในนั้น:

/*
 * Filename: css/style.css
 */
h2 {
  color: white;
  background: red;
}

และด้านล่างเป็นรหัสในปลั๊กอินที่ใช้งานได้:

<?php
/**
 * Plugin Name: CSS on Shortcode
 * Description: Shows how to conditionally load a shortcode
 * Author: Mike Schinkel <mike@newclarity.net>
 */
class CSS_On_Shortcode {

  /**
   * @var CSS_On_Shortcode
   */
  private static $_this;

  /**
   * @var string 'yes'/'no' vs. true/false as get_post_meta() returns '' for false and not found.
   */
  var $shortcode_used = 'no';

  /**
   * @var string
   */
  var $HAS_SHORTCODE_KEY = '_has_trigger-css_shortcode';
  /**
   *
   */
  function __construct() {
    self::$_this = $this;
    add_shortcode( 'trigger-css', array( $this, 'do_shortcode' ) );
    add_filter( 'the_content', array( $this, 'the_content' ), 12 ); // AFTER WordPress' do_shortcode()
    add_action( 'save_post', array( $this, 'save_post' ) );
    add_action( 'wp_print_styles', array( $this, 'wp_print_styles' ) );
  }

  /**
   * @return CSS_On_Shortcode
   */
  function this() {
    return self::$_this;
  }

  /**
   * @param array $arguments
   * @param string $content
   * @return string
   */
  function do_shortcode( $arguments, $content ) {
    /**
     * If this shortcode is being used, capture the value so we can save to post_meta in the 'the_content' filter.
     */
    $this->shortcode_used = 'yes';
    return '<h2>THIS POST WILL ADD CSS TO MAKE H2 TAGS WHITE ON RED</h2>';
  }

  /**
   * Delete the 'has_shortcode' meta value so that it can be regenerated
   * on first page load in case shortcode use has changed.
   *
   * @param int $post_id
   */
  function save_post( $post_id ) {
    delete_post_meta( $post_id, $this->HAS_SHORTCODE_KEY );
    /**
     * Now load the post asynchronously via HTTP to pre-set the meta value for $this->HAS_SHORTCODE_KEY.
     */
    wp_remote_request( get_permalink( $post_id ), array( 'blocking' => false ) );
  }

  /**
   * @param array $args
   *
   * @return array
   */
  function wp_print_styles( $args ) {
    global $post;
    if ( 'no' != get_post_meta( $post->ID, $this->HAS_SHORTCODE_KEY, true ) ) {
      /**
       * Only bypass if set to 'no' as '' is unknown.
       */
      wp_enqueue_style( 'css-on-shortcode', plugins_url( 'css/style.css', __FILE__ ) );
    }
   }

  /**
   * @param string $content
   * @return string
   */
  function the_content( $content ) {
    global $post;
    if ( '' === get_post_meta( $post->ID, $this->HAS_SHORTCODE_KEY, true ) ) {
      /**
       * This is the first time the shortcode has ever been seen for this post.
       * Save a post_meta key so that next time we'll know this post uses this shortcode
       */
      update_post_meta( $post->ID, $this->HAS_SHORTCODE_KEY, $this->shortcode_used );
    }
    /**
     * Remove this filter now. We don't need it for this post again.
     */
    remove_filter( 'the_content', array( $this, 'the_content' ), 12 );
    return $content;
  }

}
new CSS_On_Shortcode();

ภาพตัวอย่างหน้าจอ

นี่คือชุดของภาพหน้าจอ

เครื่องมือแก้ไขบทความพื้นฐานไม่มีเนื้อหา

โพสต์ดิสเพลย์ไม่มีเนื้อหา

เครื่องมือแก้ไขบทความพื้นฐานพร้อม[trigger-css]รหัสย่อ

โพสต์จอแสดงผลพร้อม[trigger-css]รหัสย่อ

ไม่แน่ใจว่ามัน 100%

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


ดังนั้นห้าปลั๊กอินที่ใช้วิธีการของคุณจะเรียกการร้องขอระยะไกลห้าครั้งทุกครั้งที่บันทึกโพสต์ ฉันอยากจะใช้ regex post_contentบน และรหัสย่อในวิดเจ็ตล่ะ
fuxia

@toscho การทริกเกอร์การโหลดโพสต์เป็นทางเลือก มีเพียงเพื่อให้แน่ใจว่าผู้ใช้ไม่จำเป็นต้องเห็นการโหลดหน้าแรกด้วยการโหลดภายนอก มันเป็นสายที่ไม่มีการบล็อคดังนั้นในทางทฤษฎีคุณไม่ควรสังเกต สำหรับรหัสของเราเรากำลังทำในชั้นฐานเพื่อให้ชั้นฐานสามารถจัดการกับมันทำเพียงครั้งเดียว เราสามารถขอ'pre_http_request'ใช้งาน hook และปิดการใช้งานการโทรหลายครั้งไปยัง URL เดียวกันในขณะที่'save_post'ใช้งาน hook แต่ฉันต้องการรอจนกว่า w จะเห็นความต้องการดังกล่าวจริงหรือไม่? สำหรับวิดเจ็ตมันสามารถปรับปรุงให้จัดการได้ แต่มันไม่ใช่กรณีใช้งานที่ฉันเคยดู
MikeSchinkel

1
@toscho - นอกจากนี้คุณไม่สามารถแน่ใจได้ว่ามีรหัสย่อที่เป็นตะขออื่นอาจล้างมัน วิธีเดียวที่คุณจะมั่นใจได้ว่าถ้าฟังก์ชั่นรหัสย่อยิงจริง ดังนั้นวิธีการ regex ไม่น่าเชื่อถือ 100%
MikeSchinkel

ฉันรู้ว่า. นอกจากนี้ไม่มีทางที่กระสุนจะฉีด CSS สำหรับย่อ (ยกเว้นใช้<style>)
fuxia

ฉันทำงานกับการนำไปใช้งานตามวิธีแก้ปัญหานี้และฉันต้องการชี้ให้เห็นว่าวิธีนี้จะไม่เข้าคิวเพื่อดูตัวอย่างการโพสต์ / หน้า
mor7ifer

5

Googling พบฉันที่มีศักยภาพ คำตอบ ฉันพูดว่า "มีศักยภาพ" ตามที่ดูดีควรใช้งานได้ แต่ฉันไม่เชื่อ 100% ว่าเป็นวิธีที่ดีที่สุดในการทำ:

add_action( 'wp_print_styles', 'yourplugin_include_css' );
function yourplugin_include_css() {
    // Check if shortcode exists in page or post content
    global $post;

    // I removed the end ' ] '... so it can accept args.
    if ( strstr( $post->post_content, '[yourshortcode ' ) ) {
        echo $csslink;
    }
}

สิ่งนี้ควรจะสามารถตรวจสอบว่าโพสต์ปัจจุบันใช้รหัสย่อและเพิ่มสไตล์ชีทให้กับ<head>องค์ประกอบอย่างเหมาะสมหรือไม่ แต่ฉันไม่คิดว่ามันจะทำงานกับดัชนี (เช่นโพสต์หลายรายการในลูป) ... มันมาจากโพสต์บล็อกเก่า ๆ 2 ปีดังนั้นฉันไม่แน่ใจว่ามันจะทำงานกับ WP 3.1.X .


สิ่งนี้จะไม่ทำงานหากรหัสย่อมีข้อโต้แย้ง หากคุณต้องการไปทางนี้ช้ามากให้ใช้ WP get_shortcode_regex()เพื่อค้นหา
onetrickpony

เช่นเดียวกับที่ฉันพูดว่า "มีศักยภาพ" คำตอบที่ฉันยังไม่ได้ทดสอบ ... :-)
EAMann

นี่เป็นวิธีเดียวกับวิธีที่ 2 แต่ก็ยังไม่ตรวจสอบเทมเพลตสำหรับการโทร do_shortcode ()
Ian Dunn

ทำไมต้องทำเช่นนั้น? หากคุณโทรdo_shortcode()ด้วยตนเองในเทมเพลตคุณก็รู้อยู่แล้วว่าคุณกำลังเรียกใช้
รหัสย่อ

ฉันไม่ใช่คนที่โทรหารหัสย่อผู้ใช้คือ นี่เป็นปลั๊กอินที่แจกจ่ายไม่ใช่ปลั๊กอินส่วนบุคคล
Ian Dunn

2

ด้วยการใช้คำตอบของ TheDeadMedic และเอกสารประกอบ get_shortcode_regex () (ที่จริงไม่พบรหัสย่อของฉัน) ฉันได้สร้างฟังก์ชั่นง่าย ๆ ที่ใช้ในการจัดคิวสคริปต์สำหรับรหัสย่อหลายชุด เนื่องจาก wp_enqueue_script () เป็นรหัสย่อเพิ่มในส่วนท้ายเท่านั้นจึงมีประโยชน์เนื่องจากสามารถจัดการกับสคริปต์ส่วนหัวและส่วนท้าย


function add_shortcode_scripts() {
    global $wp_query;   
    $posts = $wp_query->posts;
    $scripts = array(
        array(
            'handle' => 'map',
            'src' => 'http://maps.googleapis.com/maps/api/js?sensor=false',
            'deps' => '',
            'ver' => '3.0',
            'footer' => false
        ),
        array(
            'handle' => 'contact-form',
            'src' => get_template_directory_uri() . '/library/js/jquery.validate.min.js',
            'deps' => array( 'jquery' ),
            'ver' => '1.11.1',
            'footer' => true
        )   
    );

    foreach ( $posts as $post ) {
        foreach ( $scripts as $script ) {
            if ( preg_match( '#\[ *' . $script['handle'] . '([^\]])*\]#i', $post->post_content ) ) {
                // enqueue css and/or js
                if ( wp_script_is( $script['handle'], 'registered' ) ) {
                    return;
                } else {
                    wp_register_script( $script['handle'], $script['src'], $script['deps'], $script['ver'], $script['footer'] );
                    wp_enqueue_script( $script['handle'] );
                }
            }
        }
    }
}
add_action( 'wp', 'add_shortcode_scripts' );

1

ในที่สุดฉันก็พบวิธีแก้ปัญหาสำหรับการโหลด CSS แบบมีเงื่อนไขซึ่งใช้ได้กับปลั๊กอินของฉันwww.mapsmarker.comและฉันต้องการแบ่งปันกับคุณ มันจะตรวจสอบว่ามีการใช้รหัสย่อของฉันในไฟล์เทมเพลตปัจจุบันและ header / footer.php หรือไม่และถ้าใช่ให้จัดสไตล์ชีทที่จำเป็นในส่วนหัว:

  function prefix_template_check_shortcode( $template ) {
    $searchterm = '[mapsmarker';
    $files = array( $template, get_stylesheet_directory() . DIRECTORY_SEPARATOR . 'header.php', get_stylesheet_directory() . DIRECTORY_SEPARATOR . 'footer.php' );
    foreach( $files as $file ) {
        if( file_exists($file) ) {
            $contents = file_get_contents($file);
            if( strpos( $contents, $searchterm )  ) {
                wp_enqueue_style('
leafletmapsmarker', LEAFLET_PLUGIN_URL . 'leaflet-dist/leaflet.css');
                  break; 
            }
        }
    }
  return $template;
  }  
  add_action('template_include','prefix_template_check_shortcode' );

นิดหน่อย แต่นี่ไม่ได้หมายความว่าผู้คนกำลังใช้ header.php และ footer.php สิ่งที่เกี่ยวกับวิธีการตัดรูปแบบดังกล่าวที่ระบุไว้โดยscribu.net/wordpress/theme-wrappers.html ? หรือชุดรูปแบบเช่นรากที่เก็บส่วนแม่แบบไว้ที่อื่น?
orionrush

1

สำหรับปลั๊กอินของฉันฉันพบว่าผู้ใช้บางครั้งอาจมีการสร้างรูปแบบที่มีรหัสที่เก็บไว้ในข้อมูล meta โพสต์ นี่คือสิ่งที่ฉันใช้เพื่อตรวจสอบว่ามีรหัสย่อปลั๊กอินอยู่ในโพสต์ปัจจุบันหรือโพสต์ข้อมูลเมตา :

function abcd_load_my_shorcode_resources() {
       global $post, $wpdb;

       // determine whether this page contains "my_shortcode" shortcode
       $shortcode_found = false;
       if ( has_shortcode($post->post_content, 'my_shortcode') ) {
          $shortcode_found = true;
       } else if ( isset($post->ID) ) {
          $result = $wpdb->get_var( $wpdb->prepare(
            "SELECT count(*) FROM $wpdb->postmeta " .
            "WHERE post_id = %d and meta_value LIKE '%%my_shortcode%%'", $post->ID ) );
          $shortcode_found = ! empty( $result );
       }

       if ( $shortcode_found ) {
          wp_enqueue_script(...);
          wp_enqueue_style(...);
       }
}
add_action( 'wp_enqueue_scripts', 'abcd_load_my_shorcode_resources' );

0

เพราะ CSS ควรประกาศภายใน <head>

สำหรับไฟล์ CSS คุณสามารถโหลดไฟล์เหล่านั้นได้ในเอาท์พุตรหัสย่อ

<style type="text/css">
  @import "path/to/your.css"; 
</style>

ตั้งค่าคงที่หรือบางสิ่งหลังจากนี้เช่นMY_CSS_LOADED(รวมเฉพาะ CSS หากไม่ได้ตั้งค่าคงที่)

ทั้งสองวิธีของคุณช้ากว่าวิธีนี้

สำหรับไฟล์ JS คุณสามารถทำเช่นเดียวกันหากสคริปต์ที่คุณกำลังโหลดนั้นไม่เหมือนใครและไม่มีการพึ่งพาภายนอก หากไม่ใช่กรณีนี้โหลดภายในส่วนท้าย แต่ใช้ค่าคงที่เพื่อพิจารณาว่าจำเป็นต้องโหลดหรือไม่ ...


3
การโหลด CSS นอก<head>องค์ประกอบนั้นไม่ใช่มาร์กอัปที่เหมาะสม จริงการตรวจสอบเป็นเพียงแนวทาง แต่ถ้าเราพยายามที่จะยึดแนวทางนั้นมันทำให้การโหลดสไตล์ชีทภายในเอาท์พุทรหัสย่อเป็นความคิดที่ไม่ดี
EAMann

บล็อก CSS แบบอินไลน์เป็นมาร์กอัปที่ถูกต้องแม้ใน XHTML จากสิ่งที่ฉันจำได้ ไม่มีเหตุผลที่จะไม่ใช้มันเมื่อคุณไม่มีทางเลือกอื่นที่ยอมรับได้
onetrickpony

1
ตามที่เครื่องมือตรวจสอบของ <style type="text/css"> The element named above was found in a context where it is not allowed. This could mean that you have incorrectly nested elements -- such as a "style" element in the "body" section instead of inside "head"W3C: ดังนั้นรูปแบบอินไลน์ ( <element style="..."></element>) จึงใช้ได้ แต่<style>องค์ประกอบแบบอินไลน์ไม่ได้
EAMann

1
ทำให้มันสามารถกรองได้และปลั๊กอินหรือชุดรูปแบบอื่น ๆ สามารถทำได้ตามที่ต้องการ หากพวกเขากำหนดค่าตัวกรองเพื่อส่งคืนสตริงว่าง - จะไม่มีการพิมพ์อะไรเลย
mfields

1
คุณไม่ได้พูดถึงเหตุผลวัตถุประสงค์ใด ๆ ในการฝึกหัดนี้ อย่างไรก็ตามมันไม่สำคัญ ฉันเห็นเพียงสองตัวเลือกที่นี่: โหลด CSS / สคริปต์เสมอ (ปรับให้เหมาะกับขนาด) หรือปรับสไตล์อินไลน์ตามเงื่อนไข
onetrickpony

0

สคริปต์ลอจิกเป็นปลั๊กอิน WordPress ที่ให้คุณควบคุมไฟล์ JavaScript และ CSS ทั้งหมดได้อย่างสมบูรณ์ การใช้ปลั๊กอินนี้คุณสามารถโหลดไฟล์ CSS และ JS แบบมีเงื่อนไขบนหน้าเว็บที่จำเป็นเท่านั้น

http://wordpress.org/plugins/script-logic/


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