the_content এবং is_main_query


15

আমি ফিল্টার দিয়ে সামগ্রী the_contentফিল্টার করছি। সবকিছু নিখুঁতভাবে কাজ করে, উদ্ধৃতিতে আমার পরিবর্তনগুলি কাস্টম ক্যোয়ারিতেও প্রয়োগ করা হয়। উইজেট যদি কাস্টম কোয়েরি ব্যবহার করে তবে আমার পরিবর্তনগুলি পাশাপাশি সাইডবারে উপস্থিত হবে

এর মোকাবিলা করতে, আমি is_main_query()কেবলমাত্র মূল ক্যোয়ারীটি লক্ষ্যবস্তু করতে ব্যবহার করছি , তবে এটি কাজ করছে না। পরিবর্তনগুলি কেবল এখনও বাইরে থাকা সমস্ত প্রশ্নের ক্ষেত্রে প্রয়োগ করা হয়। তবে মজার বিষয় কী, অন্যান্য সমস্ত শর্তাধীন পরীক্ষাগুলি যদি আমি নির্দিষ্ট পৃষ্ঠাগুলিকে লক্ষ্যবস্তু করে তবে তা পছন্দ করে is_single()এবং is_category()কাজ করছে, ব্যতীত সমস্ত পরিবর্তনগুলি সেই পৃষ্ঠার অন্য কোনও কাস্টম ক্যোয়ারিকে প্রভাবিত করে, আমি ব্যবহার করি is_main_query()বা না করি

আমি কি এখানে কিছু মিস করছি? আমি কীভাবে আমার the_contentফিল্টারটি ব্যবহার করে মূল ক্যোয়ারিতে আমার পরিবর্তনগুলি প্রয়োগ করব

add_filter('the_content', 'custom_content');

function custom_content($content){

    if(is_main_query()){ // << THIS IS NOT WORKING
        // My custom content that I add to the_content()    
    }
    return $content;
}

উত্তর:


11

in_the_loop()সত্যি কথা বলতে কী , ফাংশনটি আপনি যা সন্ধান করছেন:

add_filter( 'the_content', 'custom_content' );

function custom_content( $content ) {
    if ( in_the_loop() ) {
        // My custom content that I add to the_content()    
    }
    return $content;
}

কি in_the_loopহয়, তাহলে গ্লোবাল চেক করা হল $wp_queryবর্তমান পোস্টের (যে প্রধান ক্যোয়ারী অবজেক্ট) -1 < $current_post < $post_count

মূল ক্যোয়ারি যখন লুপিং হয় তখন এটি ঘটে, কারণ লুপটি শুরু হওয়ার আগে বর্তমান পোস্টটি -1 হয় এবং লুপ শেষ হওয়ার পরে বর্তমান পোস্টটি আবার -1 এ পুনরায় সেট করা হয়।

সুতরাং, যদি in_the_loop()সত্য হয় তবে এর অর্থ হ'ল মূল ক্যোয়ারী অবজেক্টটি লুপিং, যা আপনার এই ক্ষেত্রে প্রয়োজন (এবং ক্রিয়াটি যুক্ত করা loop_startএবং অপসারণের একই ফল loop_end@ উত্তরটি লিখেছেন উত্তরটি; বাস্তবে এটি কাজ করে একই কারণে, এবং আমার +1 পেয়েছে)।

@ আইওলোকিনের পদ্ধতির সুবিধা হ'ল আপনি যখন মুখ্যটির চেয়ে আলাদা কোয়েরি অবজেক্টকে লক্ষ্য করতে চান, কারণ in_the_loop()কেবলমাত্র মূল প্রশ্নের জন্য কাজ করে works


আমার সাইটের অনুসন্ধান বা অনলাইন অনুসন্ধানের কোনওটিতেই আমি এগুলি দেখতে পাইনি। একটি লুকানো রত্ন যা কাজ করে। প্রতিটি সমাধান ব্যবহার করে is_main_query, সত্যিই ভাবেন যে কেউ এটিকে পুরোপুরি পরীক্ষা করে নি। আপনার
ইনপুটটির

1
@ পিটারগুজেন খুশী এটি কাজ করে। এটি একটি খুব পুরানো ফাংশন, যখন is_main_queryকোনও জিনিস ছিল না তখন থেকে সরাসরি চলে আসা ।
গাজাজ্যাপ

আপনি দেখুন, আমি এখানে এটি মিস করেছি, আমি কোনও পুরানো টাইমার নই :-), ৩.৩-এ ওয়ার্ডপ্রেসে যোগ দিয়েছি।
পিটার গুজন

2
@ জিএম আপনার উত্তরটিতে এটি যুক্ত করতে আপনার মনে হবে। এটি অন্যদের জন্য দরকারী তথ্য যা এই উত্তরের উপর হোঁচট খায়। বেশিরভাগ লোকেরা, আমার মতো মন্তব্যগুলি পড়ে না :-)
পিটার গুজন

1
@PieterGoosen সম্পন্ন :)
gmazzap

7

এটি কেবলমাত্র @ অট্টোর উত্তরের একটি সংযোজন। এটিকে আরও কিছুটা বোধগম্য করার জন্য। মূলত @ অটো যা বলছে, আপনাকে যুক্তিটি বিপরীত করতে হবে, এর অর্থ: আপনি যদি নির্ভরযোগ্যভাবে মূল ক্যোয়ারীটি নির্ধারণ করতে পারেন তবে আপনি the_contentফিল্টারটিতে আপনার হুকিং যুক্ত করতে - এবং মুছতে পারেন ।

উদাহরণস্বরূপ মূল জিজ্ঞাসাটি নির্ভরযোগ্যতার সাথে ক্রিয়াতে স্বীকৃতি পেতে পারে pre_get_posts, সুতরাং এটি কাজ করবে:

function wpse162747_the_content_filter_callback( $content ) {
    return $content . 'with something appended';
}

add_action( 'pre_get_posts', 'wpse162747_pre_get_posts_callback' );
function wpse162747_pre_get_posts_callback( $query ) {
    if ( $query->is_main_query() ) {
        add_filter( 'the_content', 'wpse162747_the_content_filter_callback' );
    }
}

যেহেতু আপনার যখন ফিল্টারটির আর প্রয়োজন হয় না তখন এটি অপসারণ করার কথা, আমি ভাবছি loop_endকর্মটি এর জন্য ভাল জায়গা হওয়া উচিত এবং এর অংশ হিসাবে আমরা এটি ব্যবহার করতে পারি loop_start। যা দেখতে এই রকম হবে:

add_action( 'loop_start', 'wpse162747_loop_start_callback' );
function wpse162747_loop_start_callback( $query ) {
    if ( $query->is_main_query() ) {
        add_filter( 'the_content', 'wpse162747_the_content_filter_callback' );
    }
}

add_action( 'loop_end', 'wpse162747_loop_end_callback' );
function wpse162747_loop_end_callback( $query ) {
    if ( $query->is_main_query() ) {
        remove_filter( 'the_content', 'wpse162747_the_content_filter_callback' );
    }
}

এই সমাধি পরীক্ষা করবে। আপনার বিস্তারিত ব্যাখ্যার জন্য ধন্যবাদ।
পিটার গুজন

আমার সন্তুষ্টি হিসাবে সর্বদা @ পিটারগুসেন হুট করেই তাড়াহুড়া করবেন না, তবে তা করুন কারণ আমি নেই - কমপক্ষে পর্যাপ্ত পর্যাপ্তও নয়।
নিকোলাই

1
কী যদি শর্টকোডটি # কনটেন্ট () এর মধ্যে ব্যবহার করা হয় এবং শর্টকোড আরেকটি ক্যোয়ারী শুরু করে যে কলটি (কনটেন্ট) কল করে, বর্তমান পোস্ট অবজেক্টটি পুনরায় সেট করে এবং লুপটি চালিয়ে যায়? সমস্ত ফিল্টার প্রয়োগ করা হবে। এখানে অত্যন্ত জটিল, বেল ইন_থ_লুপ () এর মাধ্যমে সংরক্ষণ করা হয়নি ... তবে যে কারণেই আমি নিকোলাইয়ের কাছে পৌঁছেছি, অনন্য ফিল্টারগুলি যত তাড়াতাড়ি সম্পন্ন করা যায় সর্বদা অপসারণ করার পরামর্শ দিই
জোনাস লন্ডম্যান

5

আপনি is_main_query()ভুলভাবে ব্যবহার করছেন । গ্লোবাল is_main_query () ফাংশনটি সত্যায়িত হয় যদি না গ্লোবাল $ wp_quary ভেরিয়েবলটির নতুন সংজ্ঞা দেওয়া হয়।

কোনও_একটি কনটেন্ট ফিল্টারের ভিতরে থেকে সম্ভবত কোনও 100% নির্ভরযোগ্য উপায় নেই, আপনি যে বর্তমান লুপটিতে রয়েছেন তা মূল জিজ্ঞাসা কিনা তা নয়। সামগ্রী ফিল্টার কেবল সামগ্রী ফিল্টার করে। এটি কোন লুপটি ব্যবহৃত হচ্ছে তা জানার ক্ষমতার কোনও রূপ নেই।

পরিবর্তে, যখন আপনার প্রয়োজন হবে তখন আপনার ফিল্টারটি যুক্ত করা উচিত, তারপরে আপনি যখন যাবেন না তখন এটি সরিয়ে ফেলুন।


এটি প্রকৃতপক্ষে একটি ডাউন-ডাউন যে the_contentফিল্টার দিয়ে মূল ক্যোয়ারিকে টার্গেট করার জন্য কোনও সোজা উপায় নেই
পিটার গুসেন

ঠিক আছে, যদিও এটি বিস্ময়কর নয়। অন্য যে কোনও ফিল্টারের মতো এটি কেবল জিনিসগুলি ফিল্টার করে। এটি কখন ডাকা হচ্ছে তার চারপাশের প্রসঙ্গটি জানেন না। এমনকি এটি কোনও সঠিক লুপের অভ্যন্তর থেকে ডাকা হবে না। এটি বলার উপায় নেই।
অটো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.