यदि कोई विशेष शोर्ट या विजेट मौजूद है तो ही स्क्रिप्ट लोड कर रहा है


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');

जो कि पूरी तरह से शानदार है और मैंने जो किया, वह ठीक है।

अब मुझे इसे थोड़ा आगे बढ़ाने और साइडबार के लिए भी ऐसा करने की आवश्यकता है। यह एक विशेष विजेट प्रकार, शोर्ट, कोड स्निपेट या किसी और चीज से हो सकता है जो स्क्रिप्ट को लोड करने की आवश्यकता होने पर पहचानने के लिए काम करेगा।

समस्या यह है कि मैं यह पता नहीं लगा सकता कि साइडबार लोड होने से पहले साइडबार की सामग्री का उपयोग कैसे किया जाए (प्रश्न में विषय कई बार लिखा जाएगा)


क्या हेडर में स्क्रिप्ट आपकी स्थिति के लिए कठिन आवश्यकता है? पृष्ठ के अंत में लिपियों को प्रदर्शन के लिए सशर्त और अनुशंसित अभ्यास से निपटना आसान होता है।
रारस्ट

मैंने इसे पहले wp_footer में आज़माया था जो अच्छी तरह से सामग्री को प्रीफ़िल्टर करने की आवश्यकता को समाप्त कर देता है, लेकिन जब स्क्रिप्ट ठीक लोड होती है, तो वे काम नहीं करते थे। इन लिपियों को wp_head में होना चाहिए जो उन्हें करने की आवश्यकता है।
एशले जी

जवाबों:


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- / 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') );
    }

जिसे BEFORE कहा जा सकता है विगेट्स लोड किए गए हैं। स्पष्ट होने के लिए यह पृष्ठ लोड होने से पहले होना है। मेरा नमूना कोड पृष्ठ पर सामग्री को फ़िल्टर करने के लिए the_posts का उपयोग करता है, लेकिन वह साइडबार / विजेट नहीं मिलता है।
एशले जी

हां, मैंने अपने उत्तर में जो उदाहरण दिया है, उसे देखें।
sorich87

आपका उदाहरण वास्तव में काम नहीं करता है। क्या मुझसे साफ़ - साफ़ कुछ चीज़ चूक रही है?
एशले जी

वास्तव में मैं था। wp_enqueue_script wp_head पर लागू होने पर काम नहीं करता है, लेकिन wp_print_scripts करता है। wp_enqueue_script तब काम करता है जब अगर init को इस तरह लागू किया जाता है: add_action ('init', 'check_widget');
एशले जी

हालाँकि यह साइट के हर पृष्ठ पर स्क्रिप्ट को लोड करता है, भले ही विजेट केवल एक साइडबार में सक्रिय हो। उदाहरण के लिए अगर मेरे पास ब्लॉग पेजों के लिए एक साइडबार और अन्य पेजों के लिए एक साइडबार है। मैं खोज विजेट को ब्लॉग साइडबार में जोड़ता हूं और स्क्रिप्ट लोड करता है, लेकिन यह उन पृष्ठों पर भी लोड होता है जिनमें ब्लॉग साइडबार नहीं है। मुझे स्क्रिप्ट को लोड करने में सक्षम होने की आवश्यकता है यदि विजेट उस पृष्ठ पर मौजूद है।
एशले जी

3

बस एक समाधान साझा करना चाहता था, जिस पर मैंने काम किया और मुझे अपने कार्यान्वयन के साथ थोड़ा और अधिक बहुमुखी बनाने की अनुमति दी। विभिन्न प्रकार के शॉर्टकोड के लिए फ़ंक्शन की जांच करने के बजाय, मैंने एक स्क्रिप्ट / शैली फ़ंक्शन का संदर्भ देने वाले एकल शोर्ट को ढूंढने के लिए इसे संशोधित किया है। यह दोनों तरीकों के लिए अन्य वर्गों में काम करेगा (जैसे कि प्लगइन्स जो स्वयं ऐसा नहीं कर सकते हैं) और इन-स्कोप फ़ंक्शन। बस नीचे दिए गए कोड को functions.php में छोड़ दें और किसी भी पेज / पोस्ट पर जहाँ आप विशिष्ट CSS & JS चाहते हैं, निम्नलिखित सिंटैक्स जोड़ें।

पृष्ठ / पोस्ट सिंटैक्स: [loadCSSandJS फ़ंक्शन = "(वर्ग-> विधि / फ़ंक्शन नाम)"]

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_tagथा WP 4.7 में शुरू की और पाया जा सकता है नई डेवलपर्स प्रलेखन पृष्ठों की है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.