কোনও নির্দিষ্ট শর্ট কোড বা উইজেট উপস্থিত থাকলে স্ক্রিপ্টগুলি লোড করা হয়


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 এ চেষ্টা করেছিলাম যা কন্টেন্টটি প্রিফিল্টিংয়ের প্রয়োজনীয়তা সুন্দরভাবে মুছে ফেলেছে, তবে স্ক্রিপ্টগুলি সূক্ষ্ম লোড করার পরেও সেগুলি কার্যকর হয়নি। এই স্ক্রিপ্টগুলি তাদের যা করতে হবে তা করার জন্য ডাব্লিউপি_হেডে থাকতে হবে।
অ্যাশলে জি

উত্তর:


20

আপনি_অ্যাকটিভ_উইজেট ফাংশনটি ব্যবহার করতে পারেন । উদাহরণ:

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 () কোড যুক্ত করতে হবে। উদাহরণস্বরূপ, ডিফল্ট সাম্প্রতিক মন্তব্যসমূহের উইজেটটি দেখুন (ডাব্লুপি-অন্তর্ভুক্ত / ডিফল্ট-উইজেটস.এফপি, লাইন 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 ব্যবহার করে, তবে এটি সাইডবারগুলি / উইজেটগুলি পায় না।
অ্যাশলে জি

হ্যাঁ, আমি আমার উত্তরে যে উদাহরণটি যুক্ত করেছি তা দেখুন।
sorich87

আপনার উদাহরণ আসলে কাজ করে না। আমি কি স্পষ্ট কিছু মিস করছি?
অ্যাশলে জি

আসলে আমি ছিলাম। wp_enqueue_script wp_head এ প্রয়োগ করার সময় কাজ করে না বলে মনে হয়, তবে wp_print_script কাজ করে। wp_enqueue_script কাজ করে তবে থের মতো প্রয়োগ করা থাকলে: add_action ('init', 'check_widget');
অ্যাশলে জি

তবে এটি উইজেট কেবলমাত্র একটি সাইডবারে সক্রিয় থাকলেও সাইটের প্রতিটি পৃষ্ঠায় স্ক্রিপ্টগুলি লোড করে। উদাহরণস্বরূপ, যদি আমার ব্লগ পৃষ্ঠাগুলির জন্য একটি সাইডবার এবং অন্যান্য পৃষ্ঠাগুলির জন্য অন্য একটি সাইডবার থাকে। আমি ব্লগের সাইডবারে অনুসন্ধানের উইজেট যুক্ত করি এবং স্ক্রিপ্টগুলি লোড হয়, তবে এটি এমন পৃষ্ঠাগুলিতে লোড হয় যা ব্লগের সাইডবার নেই। উইজেটটি সেই পৃষ্ঠাতে উপস্থিত থাকলে আমার স্ক্রিপ্টটি লোড করতে সক্ষম হতে হবে।
অ্যাশলে জি

3

আমি কেবল এমন একটি সমাধান ভাগ করে নিতে চেয়েছিলাম যাতে আমি কাজ করেছিলাম যা আমার বাস্তবায়নের সাথে আমাকে আরও কিছুটা বহুমুখী হতে দেয়। বিভিন্ন শর্টকোডের জন্য ফাংশন চেক করার পরিবর্তে, আমি এটিকে সংশোধন করে একটি একক শর্টকোড সন্ধান করতে চাই যা একটি স্ক্রিপ্ট / শৈলীর ক্রিয়াকলাপটি উল্লেখ করা দরকার। এটি অন্যান্য ক্লাসে উভয় পদ্ধতির জন্য কাজ করবে (যেমন প্লাগিনগুলি যা তারা নিজেরাই না করে) এবং ইন-স্কোপ ফাংশনগুলি। কেবলমাত্র ফাংশন.এফপি-তে নীচের কোডটি ফেলে দিন এবং যেখানে আপনি নির্দিষ্ট সিএসএস এবং জেএস চান সেখানে যে কোনও পৃষ্ঠা / পোস্টে নীচের বাক্য গঠন যুক্ত করুন।

পৃষ্ঠা / পোস্ট সিনট্যাক্স: [loadCSSandJS ফাংশন = "(শ্রেণি-> পদ্ধতি / ফাংশন নাম)"]

ফাংশন.এফপি কোড:

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

ওয়ার্ডপ্রেস ৪.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ছিল ডাব্লু 4.7 চালু এবং খুঁজে পাওয়া যেতে পারে নতুন ডেভেলপারদের ডকুমেন্টেশন পেজ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.