আমার কি প্রি গেট পোস্টস বা ডব্লিউপি_কিউয়ারি ব্যবহার করা উচিত


29

আমার নিম্নলিখিত কোয়েরি রয়েছে যা আমি আমার ট্যাক্সনমি.এফপি টেম্পলেট এর মাধ্যমে কল করি query_brands_geo('dealers', 'publish', '1', $taxtype, $geo, $brands);

এই ফাংশন নিখুঁতভাবে কাজ করে। তবে কোয়েরি পোস্টগুলির জন্য কোডেক্স পড়ার পরে এটি pre_get_posts কে ডিফল্ট ক্যোয়ারী পরিবর্তন করার জন্য পছন্দসই উপায় হিসাবে উল্লেখ করেছে। নীচে আমার wp_query ফাংশনটি কী তাহলে pre_get_posts আরও দক্ষ হবে?

যদি তা হয় তবে আমি কীভাবে pre_get_posts তৈরি করব এবং নীচে আমার ভেরিয়েবল এবং কোয়েরিটি পাস করব?

function my_custom_query($posttype, $poststatus, $paidvalue, $taxtype, $geo, $brands) {
   global $wp_query; 
   $wp_query = new WP_Query();
   $args = array( 
      'post_type' => $posttype, 
      'post_status' => array($poststatus), 
      'orderby' => 'rand', 
      'posts_per_page' => 30, 
      'meta_query' => array( 
         array( 
            'key' => 'wpcf-paid', 
            'value' => array($paidvalue), 
            'compare' => 'IN', 
            ) 
      ), 
      'tax_query' => array( 
         'relation' => 'AND', 
         array( 
            'taxonomy' => $taxtype, 
            'field' => 'slug', 
            'terms' => $geo 
         ), 
         array( 
            'taxonomy' => 'brands', 
            'field' => 'slug', 
            'terms' => $brands 
         ) 
      ) 
   ); 

   return $wp_query->query($args); 
} 

উত্তর:


14

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

function custom_pre_get_posts($query, $posttype='dealers', $poststatus='publish', $paidvalue='1', $taxtype='any_default_value', $geo='any_default_value', $brands='any_default_value') {

    // filter your request here.
    if($query->is_category) {

        $args = array(
            'post_type' => $posttype,
            'post_status' => array($poststatus),
            'orderby' => 'rand',
            'posts_per_page' => 30,
            'meta_query' => array(
                array(
                    'key' => 'wpcf-paid',
                    'value' => array($paidvalue),
                    'compare' => 'IN',
                )
            ),
            'tax_query' => array(
                'relation' => 'AND',
                array(
                    'taxonomy' => $taxtype,
                    'field' => 'slug',
                    'terms' => $geo
                ),
                array(
                    'taxonomy' => 'brands',
                    'field' => 'slug',
                    'terms' => $brands
                )
            )
        );
        $query->query_vars = $args;
    }
}
add_action('pre_get_posts', 'custom_pre_get_posts');

উত্তর দেওয়ার জন্য আপনাকে অনেক ধন্যবাদ। এটা খুব সহায়ক। একটি দ্রুত প্রশ্ন। আমি আমার থিম ফাংশন.এফপি ফাইলটিতে ফাংশনটি রেখেছি। আমি আমার ট্যাক্সোনমি.এফপি থেকে এই ফাংশনটি কাস্টম_প্রিয়_গেট_পোস্টগুলি ($ কোয়েরি) চালাচ্ছি। ট্যাক্সোনমি.এফপি-তে আমি ভেরিয়েবলগুলি সেট করেছিলাম, $ পোস্টটাইপ, $ পোস্ট_স্ট্যাটাস, $ জিও, $ ব্র্যান্ডস, $ টেক্সটাইপ এবং এই ভেরিয়েবল পরিবর্তন করে দুটি লুপ চালনা করি। ট্যাক্সোনমি.এফপি থেকে উপরের ফাংশনে ভেরিয়েবল পাস করার কোনও উপায় আছে কি? যখন আমি কাস্টম_প্রেম_সেট_পোস্টগুলি চেষ্টা করি ($ ক্যোয়ারী, 'ডিলার', 'প্রকাশ', '1', $ টেক্সটাইপ, $ জিও, $ ব্র্যান্ড); আমি কাস্টম_প্রেম_সেট_পোস্টগুলি () এর জন্য 2 থেকে 7 এর মধ্যে যুক্তি মিস করছি। আমি যুক্ত_অ্যাকশন কারণে ধরে নিই ???
ব্যবহারকারী1609391

1
আমি ধরে নিচ্ছি আপনি বাকি আর্গুমেন্টগুলি গ্রহণ করার জন্য কাস্টম_প্রেম_সেট_পোস্টগুলি পরিবর্তন করেছেন। হ্যাঁ, অ্যাডঅ্যাকশনটির কারণে আপনি ত্রুটি পাচ্ছেন। যোগ_অ্যাকশনটি এই ফাংশনটিকে একক যুক্তি (যেমন $ কোয়েরি) দিয়ে কল করে, আপনার আর্গুমেন্টের ত্রুটিগুলি এড়ানোর জন্য অন্য যুক্তিগুলিকে ডিফল্ট মান দেওয়া উচিত give যেমন ($ পোস্ট টাইপ = নাল, $ পোষ্টস্ট্যাটাস = নাল ...) যাতে এটি অ্যাড_অ্যাকশন দ্বারা সঠিকভাবে কল করা যায়।
মিস্টার

মিঃ উত্তরের জন্য আপনাকে ধন্যবাদ। আমি অ্যাড অ্যাকশনটি পড়েছি এবং আমি দেখছি আমার একটি অগ্রাধিকার এবং আর্গুমেন্ট নম্বর বরাদ্দ করা উচিত। সুতরাং আমি আমার অ্যাড অ্যাকশনটিকে <কোড> যোগ_অ্যাকশন ('pre_get_posts', 'কাস্টম_প্রেম_সেট_পোস্টস', 10,7) এ পরিবর্তন করেছি; </ কোড> তারপরে আমার ট্যাক্সোনমি.এফপি পৃষ্ঠায় আমি <কোড> করুন_অ্যাকশন ('pre_get_post', $ কোয়েরি, ' ডিলার ',' প্রকাশ ',' 1 ', $ টেক্সটাইপ, $ জিও, $ ব্র্যান্ড); </ কোড>। তবে আমি এখনও একই ত্রুটি পাচ্ছি। আমি ডিফল্ট মান কোথায় রাখব তা নিশ্চিত ছিলাম না। আমি গুগল চেষ্টা করেছিলাম কিন্তু রেফারেন্স পাইনি। আপনি কীভাবে এটি পরিচালনা করবেন সে সম্পর্কে আমাকে আরও কিছু তথ্য দিতে পারেন?
ব্যবহারকারী1609391

উত্তর এবং উদাহরণের জন্য আপনাকে ধন্যবাদ। তবে আমি মনে করি যখন আমি যখন একটি নতুন ওয়ার্ডপ্রেস কোয়েরি করছিলাম তখনই আমি প্রাক_সেজ_পোস্টগুলি ব্যবহার করার চেষ্টা করছি। আমি একটি জিজ্ঞাসা সংরক্ষণ করার চেষ্টা করছিলাম, তবে আমার ক্ষেত্রে এটি সম্ভব নাও হতে পারে। কারণটি হ'ল প্যারামিটারে সেট করা সমস্ত যুক্তি, আমি আমার ট্যাক্সোনমি.এফপি ফাইল থেকে ফাংশনে যেতে চাইছিলাম। সুতরাং ট্যাক্সোনমি.এফপিতে আমি যে শর্তটি চালাচ্ছি তার উপর নির্ভর করে $ প্রদত্ত মূল্য = "1" 1 বা 0 হতে পারে। এটি আমার ট্যাক্সোনমি.এফপি ফাইলটিতে ফাংশনটি কল না করলেও পৃষ্ঠাটি লোড হয়ে গেলে ঠিকই উপরের_সামগ্রী_পোস্টগুলি আগুনের উপরে লাগে seems আমি কি এটি সঠিক দেখছি?
ব্যবহারকারী1609391

3
এই উত্তরটি বর্তমানে লেখা হিসাবে এটি বুদ্ধিমানের । আপনি কার্যকরভাবে অবজেক্টের অভ্যন্তরে যে কোনও মান মুছে$wp_query ফেলবেন এবং জিনিসগুলি সম্পূর্ণরূপে ব্যর্থ হবে। এ ছাড়া এটি কেবল সত্য নয় যা pre_get_postsঅতিরিক্ত ক্যোয়ারী চালাবে ...
কায়সার

10

সর্বাধিক উত্সাহিত উত্তর হিসাবে দেরী করা উত্তর আপনার ক্যোয়ারীটিকে ভেঙে দেবে এবং কিছু প্রধান পয়েন্টগুলিতে কেবল এটি সত্য নয়।

প্রধান WP_Query এবং এটি এর ফিল্টার

প্রথমত, ওয়ার্ডপ্রেস অভ্যন্তরীণভাবে ব্যবহার query_posts()(কাছাকাছি একটি পাতলা মোড়কের WP_Queryযে করা উচিত নয় থিম বা প্লাগিন ব্যবহার করা) একটি করতে WP_Query। এটি WP_Queryপ্রধান লুপ / ​​ক্যোয়ারী হিসাবে কাজ করছে। প্রকৃত এসকিউএল কোয়েরি স্ট্রিংটি তৈরি না হওয়া পর্যন্ত এই ক্যোয়ারী প্রচুর ফিল্টার এবং ক্রিয়া চলবে। এর মধ্যে অন্যতম pre_get_posts। অন্যরা হয় posts_clauses, posts_whereইত্যাদি যে এছাড়াও আপনি কোয়েরি স্ট্রিং ভবন প্রক্রিয়া ব্যাহত করার অনুমতি দেয়।

মূল অভ্যন্তরে কি ঘটে তার গভীরতার সাথে নজর দিন

ওয়ার্ডপ্রেস wp()ফাংশনটি চালায় (ইন wp-includes/functions.php), যা কল করে $wp->main()( $wpক্লাস ডাব্লুপি এর একটি বিষয়, যা সংজ্ঞায়িত হয় wp-includes/class-wp.php)। এটি ওয়ার্ডপ্রেসকে বলে:

  1. URL টি একটি কোয়েরি স্পেসিফিকেশন ব্যবহার করে পার্স করুন WP->parse_request()- নীচের অংশে আরও।
  2. কন্ডিশনাল ট্যাগ ব্যবহার করে সমস্ত is_ ভেরিয়েবল সেট করুন $wp_query->parse_query()( $wp_queryএটি একটি বিষয় class WP_Queryযা এর মধ্যে সংজ্ঞায়িত হয় wp-includes/query.php)। নোট করুন যে এই ফাংশনটির নাম সত্ত্বেও, এই ক্ষেত্রে WP_Query->parse_queryআসলে আমাদের জন্য কোনও পার্সিং করে না, যেহেতু এটি আগে হাতে করা হয়েছিল WP->parse_request()
  3. কোয়েরি স্পেসিফিকেশনটিকে একটি মাইএসকিউএল ডাটাবেস ক্যোয়ারিতে রূপান্তর করুন এবং ডাব্লুপি_কিউয়ারি-> গেট_পোস্টগুলি () ফাংশনে পোস্টের তালিকা পেতে ডাটাবেস ক্যোয়ারী চালান। ওয়ার্ডপ্রেস লুপে ব্যবহার করার জন্য পোস্টগুলিকে $ wp_query অবজেক্টে সংরক্ষণ করুন।

উত্স কোডেক্স

উপসংহার

আপনি যদি সত্যিই মূল ক্যোয়ারীটি সংশোধন করতে চান তবে আপনি বিভিন্ন ধরণের ফিল্টার ব্যবহার করতে পারেন। কেবলমাত্র সেখানে ডেটা পরিবর্তন$query->set( 'some_key', 'some_value' ); করতে ব্যবহার করুন বা শর্তাধীন চেক করতে ডেটা পুনরুদ্ধার করতে ব্যবহার করুন । আপনি কেবল এসকিউএল কোয়েরি পরিবর্তন করছেন বলে এটি আপনাকে দ্বিতীয় ক্যোয়ারী করা থেকে বাঁচাবে will$query->get( 'some_key' );

যদি আপনার অতিরিক্ত কোয়েরি করতে হয় তবে কোনও WP_Queryবস্তুর সাথে যান । এটি ডিবিতে আরও একটি ক্যোয়ারী যুক্ত করবে।

উদাহরণ

যেমন উত্তরগুলি সর্বদা একটি উদাহরণের সাথে আরও ভাল কাজ করে, আপনি এখানে একটি দুর্দান্ত একটি পেয়েছিলেন (ব্র্যাড টয়েসনার্ডের কাছে প্রপস), যা মূল বিষয়টিকে প্রসারিত করে এবং তাই এটি পুনরায় ব্যবহারযোগ্য (এটির থেকে একটি প্লাগইন তৈরি করুন):

class My_Book_Query extends WP_Query
{
    function __construct( $args = array() )
    {
        // Forced/default args
        $args = array_merge( $args, array(
            'posts_per_page' => -1
        ) );

        add_filter( 'posts_fields', array( $this, 'posts_fields' ) );

        parent::__construct( $args );
    }

    public function posts_fields( $sql )
    {
        return "{$sql}, {$GLOBALS['wpdb']->terms}.name AS 'book_category'";
    }
}

তারপরে আপনি নীচের উদাহরণে দেখতে পাচ্ছেন এমনভাবে আপনার দ্বিতীয় / অতিরিক্ত ক্যোয়ারী চালাতে পারেন। আপনার কোয়েরিটি পরে পুনরায় সেট করতে ভুলবেন না।

$book_query = new My_Book_Query();
if ( $book_query->have_posts() )
{
    while ( $book_query->have_posts() )
    {
        $book_query->the_post();
        # ...do stuff...
    } // endwhile;
    wp_reset_postdata();
} // endif;

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