হোম পেজে নিয়মিত এবং কাস্টম পোস্ট ধরণের (মেটা_কোয়ারির সাথে) মিশ্রণ


9

এটি কীভাবে অর্জন করা যায় তা নিশ্চিত নয়। আমি কোনও সাইটের হোমপেজে স্ট্যান্ডার্ড পোস্ট এবং কাস্টম পোস্টগুলি মিশ্রিত করার চেষ্টা করছি তবে একটি মেটা মান সেট করা থাকলে আমি কেবলমাত্র কাস্টম পোস্টগুলি প্রদর্শন করতে চাই। পোস্টগুলি প্রদর্শন করা ভাল কাজ করে 'post_type' => array('game', 'post')তবে আমি যখন মেটা_কোয়রিতে যুক্ত করি তখন নিয়মিত পোস্টগুলি আর প্রদর্শিত হয় না (যা মেটা_কোয়ারির শর্তটি পূরণ করে না বলে এটি বোঝায়)।

তবে আমি কীভাবে কেবলমাত্র কাস্টম পোস্ট টাইপের মধ্যে মেটা_কোয়ারিকে সীমাবদ্ধ করব যাতে নিয়মিত পোস্টটি এখনও অন্তর্ভুক্ত থাকে?


1
ভাল প্রশ্ন ... +1। আমার মনে হয় আপনি যে কাজ করতে একটি ডিফল্ট সঙ্গে পারবে না WP_Query। আপনার হয় pre_get_postsআপনার জিজ্ঞাসা পরিবর্তন বা একটি কাস্টম এসকিউএল বিবৃতি ব্যবহার করতে হবে। যাইহোক, দয়া করে আপনার বর্তমান কোডটি দেখান।
কায়সার

উত্তর:


4

কৌশলটি করার বিভিন্ন উপায় রয়েছে, 2 আমার মনে আসে:

  1. একটি সম্পূর্ণ কাস্টম $wpdbক্যোয়ারী ব্যবহার করুন
  2. ব্যবহার WP_Queryফিল্টার সঙ্গে ব্যবহার WP_Meta_Queryঅতিরিক্ত SQL গড়ে তুলতে

আমি এখানে # 2 মামলার নমুনা কোড পোস্ট করব

/**
 * Run on pre_get_posts and if on home page (look at url)
 * add posts_where, posts_join and pre_get_posts hooks
 */
function home_page_game_sql( $query ) {
  // exit if is not main query and home index
  if ( ! ( $query->is_main_query() && ! is_admin() && is_home() ) ) return;
  add_filter( 'posts_where', 'home_page_game_filter' );
  add_filter( 'posts_join', 'home_page_game_filter' );
}
add_action('pre_get_posts', 'home_page_game_sql');


/**
 * Set the SQL filtering posts_join and posts_where
 * use WP_Meta_Query to generate the additional where clause
 */
function home_page_game_filter( $sql = '' ) {
  // remove filters
  remove_filter( current_filter(), __FUNCTION__);
  static $sql_game_filters;
  if ( is_null($sql_game_filters) ) {
    // SET YOUR META QUERY ARGS HERE
    $args = array(
      array(
        'key' => 'my_custom_key',
        'value'   => 'value_your_are_looking_for',
        'compare' => '='
      )
    );
    $meta_query = new WP_Meta_Query( $args );
    $sql_game_filters = $meta_query->get_sql('post', $GLOBALS['wpdb']->posts, 'ID');
  }
  // SET YOUR CPT NAME HERE
  $cpt = 'game';
  global $wpdb;
  if ( current_filter() === 'posts_where' && isset($sql_game_filters['where']) ) {
    $where = "AND ($wpdb->posts.post_status = 'publish') ";
    $where .= "AND ( $wpdb->posts.post_type = 'post' OR ( ";
    $where .= $wpdb->prepare( "$wpdb->posts.post_type = %s", $cpt);
    $where .= $sql_game_filters['where'] . ' ) )';
    $where .= " GROUP BY $wpdb->posts.ID ";
    return $where;
  }
  if ( current_filter() === 'posts_join' && isset($sql_game_filters['join']) ) {
    return $sql .= $sql_game_filters['join'];
  }
}

আরও ব্যাখ্যা জন্য ইনলাইন মন্তব্য দেখুন।

কীভাবে আপনার মেটা ক্যোয়ারী আরোগুলি সেট করতে হবে তার সম্পূর্ণ ডক্সের জন্য কোডেক্সে ডাব্লুপি_মেটা_কিউরিও দেখুন ।


সম্পাদন করা

আমি একটি ক্লাস ব্যবহার করে একটি পুনরায় ব্যবহারযোগ্য প্লাগইনে কোডটি রিফ্যাক্টর করেছি। সারকথা হিসাবে পাওয়া যায়


1
পুরোপুরি কাজ করেছেন এবং ইনলাইন মন্তব্যের জন্য আপনাকে ধন্যবাদ। আমি কেবল কোডটি আমার ইউজেসগুলিতে অনুলিপি করেছিলাম প্লাগইনটি মেটা ক্যোয়ারী আর্গগুলিতে উপযুক্ত মানগুলি রেখেছিল যা আপনি স্টাবগুলি সরবরাহ করেছেন, হোম পৃষ্ঠা সতেজ করে দিয়েছেন এবং আমার পোস্ট এবং গেমের পোস্টগুলি তাদের পুরো গৌরবতে রয়েছে। আবার ধন্যবাদ.
এলআরএম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.