প্রথমে মেটা কী দ্বারা তালিকাটি সাজানোর জন্য প্রশ্ন (এটি উপস্থিত থাকলে), এবং শিরোনাম অনুসারে অর্পিত মেটা কী ছাড়াই অবশিষ্ট পোস্টগুলি দেখান


22

আমি একটি কাস্টম ট্যাক্সোনমি শব্দ পৃষ্ঠা টেম্পলেট নিয়ে কাজ করছি যেখানে আমরা যে প্রকাশনা তারিখ (কাস্টম তারিখের ক্ষেত্র) অনুসারে সাজানো শব্দটির সাথে সংযুক্ত আইটেমগুলি চাই - এবং যদি একই দিনে একাধিক আইটেম থাকে (YYYY-MM- এর মতো ফর্ম্যাটেড) ডিডি) তারপরে এগুলি শিরোনাম অনুসারে বাছাই করুন এবং শেষ পর্যন্ত শিরোনাম অনুসারে বাছাই করুন যদি কাস্টম ক্ষেত্রটি পূরণ না করা হয় (পুরানো আইটেমগুলি)।

সুতরাং, আমি এটি একটি ডব্লিউপি_উইকি দিয়ে শত শত বিভিন্ন উপায়ে চেষ্টা করেছি এবং এটি যেমনটি চেয়েছিল ফলাফলের বেশিরভাগ ক্ষেত্রেই তা ফিরিয়ে দেয় - তবে এই ক্ষেত্রে এটি কেবলমাত্র প্রকাশনা_ তারিখের মেটা_কি থাকা আইটেমগুলিই ফিরিয়ে দিচ্ছে। অন্যান্য সমস্ত আইটেম উপেক্ষা করা হচ্ছে এবং প্রদর্শিত হচ্ছে না। আমি "বা" একটি সম্পর্ক ব্যবহার করে একটি মেটা_কিউরি চেষ্টা করেছি এবং পাবলিকেশন_ডেটকে তুলনামূলকভাবে উপস্থিতি এবং অস্তিত্বের সাথে তুলনা করেছি, তবে এটি আমার জন্য 0 টি ফলাফল দিয়েছে।

এছাড়াও, সাইটটি এখনও 3.5.2 চলছে এবং তারা আপগ্রেড করতে চায় না।

এখানে আমার অতি সাম্প্রতিক ক্যোয়ারী যা আমাকে সেই পোস্টগুলিতে পেয়েছে যেগুলি প্রকাশনা_সামান্য কাস্টম ক্ষেত্রটি সঠিক ক্রমে প্রদর্শিত হয়েছে:

$term = get_queried_object(); // find the term of the taxonomy page we are on
$wp_query = new WP_Query( array(
'post_type' => 'resource',
'tax_query' => array(
    array(
        'taxonomy' => 'resource_types',
        'field' => 'slug',
        'terms' => $term->name,
    )), 

'meta_key' => 'publication_date',
'orderby' => 'meta_value_num',
'order' => 'DESC',
'paged' => $paged,
'posts_per_page' => '10',
));

আমি ডাব্লুপিডিবি ব্যবহার করে এবং এসকিউএল কোয়েরি চালানোর চেষ্টাও করেছি, তবে আমি কী করতে চাই তা কীভাবে সম্পাদন করতে হবে তা নিশ্চিতভাবে আমি নিশ্চিত নই। যদি কেউ আমাকে সাহায্য করতে পারে তবে তা দুর্দান্ত!

আগাম ধন্যবাদ.


বিস্মিত মেটা_কিউরি পদ্ধতির কাজ হয়নি, তবে তারপরে আবার আপনি মেটা_কি সেট না করে কোনও মেটা_কোয়ারির সাথে মেটা মান অর্ডার করতে পারবেন না।
sanchothefat

আমি মনে করি এটিই আমার সমস্যা। অবশেষে আমি একটি মেটা কোয়েরি কাজ করেছিলাম: 'meta_query' => array( 'relation' => 'OR', array( //check to see if date has been filled out 'key' => 'publication_date', 'compare' => '!=', 'value' => date('Y-m-d'), ), array( //if no date has been added show these posts too 'key' => 'publication_date', 'value' => date('Y-m-d'), 'compare' => 'NOT EXISTS' ) ),তবে
অর্ডারটি

হ্যাঁ, অর্ডার করা দুর্ভাগ্যক্রমে ট্যাক্স_কোয়ারির বাইরে মেটা_কিকে সেট করার উপর নির্ভর করে। নীচে আমার উত্তর যদিও সাহায্য করতে পারে।
sanchothefat

উত্তর:


19

আপনার সহায়তার জন্য সবাইকে ধন্যবাদ!

শেষ পর্যন্ত নীচের ক্যোয়ারীটি আমার পছন্দসই ফলাফলগুলি পেয়েছিল - যা ছিল "প্রকাশনা_সামগ্রী" এর প্রথমে কাস্টম ফিল্ডের মাধ্যমে পোস্টগুলি প্রদর্শন এবং সাজানোর জন্য - তারিখ অনুসারে বাছাই করা এবং যদি একই তারিখের একাধিক থাকে (বলুন, চিহ্নিত 4 জুন ২০১৩), এটি তাদের শিরোনাম অনুসারে বাছাই করবে। তারপরে, এটি প্রকাশের তারিখ ভরাট সমস্ত পোস্টের মধ্য দিয়ে চলে যাওয়ার পরে শিরোনাম অনুসারে, বাকী বর্ণগুলি বর্ণমালায় আবার লুপ হয়ে যাবে।

এটি আমাকে একই ক্যোয়ারিতে ফলাফল নির্ধারণ করে এবং আমার পৃষ্ঠাটি রাখে:

$term = get_queried_object();
the_post();
$wp_query = new WP_Query( array(
'post_type' => 'resource',
    'tax_query' => array(
        array(
            'taxonomy' => 'resource_types',
            'field' => 'slug',
            'terms' => $term->name,
        )),
 'meta_query' => array(
       'relation' => 'OR',
        array( //check to see if date has been filled out
                'key' => 'publication_date',
                'compare' => '=',
                'value' => date('Y-m-d')
            ),
          array( //if no date has been added show these posts too
                'key' => 'publication_date',
                'value' => date('Y-m-d'),
                'compare' => 'NOT EXISTS'
            )
        ),
'meta_key' => 'publication_date',
'orderby' => 'meta_value title',
'order' => 'ASC',
'paged' => $paged,
'posts_per_page' => '10',
));

1
খুশী হলাম। আমি কখনই দু'জনকে meta_queryএকই চাবি চালানোর চিন্তা করিনি !
ঘোস্টটোস্ট

5
আমার জন্য (ওয়ার্ডপ্রেস ৪.১.১ ব্যবহার করে), যদি আমি meta_keyএটি স্বয়ংক্রিয়ভাবে সেট করি তবে এটি এর সাথেও অন্তর্ভুক্ত হয় না NOT EXISTS। আমি সত্যিই আশা করি আমি কিছু ভুল করছি।
রায়ান টেলর

1
@ রায়ান টেইলর এখানে একই - মেটা_কি এটির কাজ করার জন্য ক্যোয়ারিতে সেট করা উচিত নয়, তবে মেটা কী সেট না করা সত্ত্বেও এটি মেটা মান দ্বারা সঠিকভাবে অর্ডার করতে দেখা যায়।
জামেপিয়েচ

2
উপরের মতামত হিসাবে, ডাব্লুপি 4.1+ এর জন্য মুছে ফেলুন বা মন্তব্য করুন 'meta_key' => 'publication_date',
মাইকিএলএল

7

কয়েক বছর পরে, সিএসএসগার্ল দ্বারা পোস্ট করা কোডটি আমার পক্ষে কাজ করছিল না কারণ এমন কিছু পোস্ট ছিল যেগুলিতে মেটা কী বা মেটা কীটি খালি ছিল না তাই তারিখ অনুসারে সমস্ত পোস্ট অর্ডার করার জন্য আমাকে এই কাজটি করতে হয়েছিল এবং প্রথমে একটি মেটা কী মান প্রদর্শনের সাথে এটিগুলি দেখান:

$args          = array(
'post_type'   => $type,
'post_status' => 'publish',
'nopaging'    => TRUE,
'meta_query'  => array(
    'relation' => 'OR',
    array(
        'key'     => $meta_key,
        'compare' => 'NOT EXISTS',
    ),
    array(
        'relation' => 'OR',
        array(
            'key'   => $meta_key,
            'value' => 'on',
        ),
        array(
            'key'     => $meta_key,
            'value'   => 'on',
            'compare' => '!=',
        ),
    ),
),
'orderby'     => array( 'meta_value' => 'DESC', 'date' => 'DESC' ),
);

1

আমার মনে হয় আপনার 2 টি পৃথক লুপ করা দরকার। আপনি প্রথম লুপে পাওয়া সমস্ত পোস্ট ক্যাপচার করতে পারেন এবং এগুলিকে সহজেই পর্যাপ্ত মাধ্যমিক লুপ থেকে বাদ দিতে পারেন:

$found_posts = array();
while($loop->have_posts()): $loop->the_post();
    // loop stuff
    $found_posts[] = get_the_id();
endwhile;

wp_reset_query();

$args = array(
    // other args
    'post__not_in' => $found_posts,
);

তারপরে আপনার দ্বিতীয় লুপটি চালান।


ধন্যবাদ, এখন এটি চেষ্টা করে। যদি এটি কাজ করে তবে আপনাকে জানাবে!
CSSgirl

1
এটি কাজ করেছে - তবে এটি পৃষ্ঠাটি ভেঙে দিয়েছে - কীভাবে এই কাজটি করবেন তা সম্পর্কে কোনও ধারণা? এটি এখন দেখতে কেমন দেখাচ্ছে তা এখানে:echo paginate_links( array( 'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ), 'format' => '?page=%#%', 'current' => max( 1, get_query_var('paged') ), 'total' => $publication_query->max_num_pages, 'prev_text' => __('Previous |'), 'next_text' => __('| Next'), ) );
CSSgirl

হুম। আমি ভাবতে পারি না এমন নয়।
ঘোস্টটোস্ট

1

আপনি কেবলমাত্র খালি মূল্য দিয়ে প্রতিটি পোস্টের জন্য প্রকাশের_ডেট মেটা কী প্রয়োগ করতে পারবেন না এমন কোনও কারণ আছে?

সুতরাং আপনার save_postক্রিয়ায় আপনি $_POSTমানটি শূন্য কিনা তা মেটা কী যুক্ত / আপডেট করবেন ।

আপনার পুরানো পোস্টগুলি লুপ করতে একটি আপডেট স্ক্রিপ্ট চালাতে হবে এবং খালি মূল্য সহ কীটি যুক্ত করতে হবে যেমন:

add_action( 'admin_init', 'update_old_posts' );
function update_old_posts() {
    if ( ! isset( $_GET[ 'update_old_posts' ] ) )
         return;

    foreach( get_posts() as $post ) {
        if ( false === get_post_meta( $post->ID, 'publication_date', true ) ) {
             update_post_meta( $post->ID, 'publication_date', '' );
             echo "Updated {$post->post_title} <br />";
        }
    }

    die;
}

Http://example.com/wp-admin/?update_old_posts ব্রাউজ করে এটি চালান

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

add_filter( 'posts_orderby', 'multicolumn_orderby', 10, 2 );
function multicolumn_orderby( $orderby, $query ) {
    global $wpdb;

    // check it's the right query
    if ( $query->get( 'meta_key' ) == 'publication_date' ) {
         $orderby = "$wpdb->postmeta.meta_value+0 DESC, $wpdb->posts.post_title ASC";
    }

    return $orderby;
}

হুম, আমি এটা ভাবিনি। আমি যে একটি চেষ্টা দিতে যাচ্ছি এবং দেখুন এটি কিভাবে যায়, ধন্যবাদ!
CSSgirl

0

আমি একটি কাস্টম তৈরি করেছি যেখানে ক্লজ। আমি $wp_query->requestআমার প্রধান লুপের ঠিক আগে এটি ব্যবহার করে পরীক্ষা করেছিলাম, এসকিউএলকে আমি সত্যিই এটি জানি না, তবে এটি জিনিসগুলি কাজ করে বলে মনে হয়েছিল।

add_action('pre_get_posts', 'add_trending_sort', 11, 1);
function add_trending_sort($query){
  if(!$query->is_main_query())
    return;

  //Overwrite query arguments
  $query->set('meta_query', array(
    array(
      'key' => 'TRENDING',
      //'value' => 'asdfasdf',//may need a value for older versions of WordPress
      'compare' => 'NOT EXISTS',
    )
  ));
  $query->set('orderby', 'meta_value_num date');
  $query->set('order', 'DESC');
}

add_filter('posts_where', 'add_trending_where');
function add_trending_where($where = ''){
  global $wpdb, $wp_query;
  if(!$wp_query->is_main_query())//Not sure if this really works.  Should be OK
    return $where;

  $where .= " OR ( $wpdb->postmeta.meta_key = 'TRENDING' )";

  // Don't run this twice
  remove_filter('posts_where', 'add_trending_where');

  return $where;
}

অন্যথা, আপনি স্থির করতে পারে compareথেকে 'EXISTS'এবং add_trending_where লাইন পরিবর্তন $where .= " OR ($wpdb->postmeta.post_id IS NULL)";। তারপরে আপনাকে কেবল এক জায়গায় কীটির মান পরিবর্তন করতে হবে। আবার, $wp_query->requestযদি আপনি এটিকে আরও ভালভাবে বুঝতে চান বা এটি টুইট করতে চান তবে প্রতিধ্বনি করুন এবং চারপাশে খেলুন।

সম্পাদনা: আমি সবেমাত্র লক্ষ্য করেছি যে কোয়েরিতে meta_keyসেট করা থাকলে এটি কাজ করে না । আপনি $query->set('meta_key', NULL);যদি ব্যবহার করতে পারেন।

সম্পাদনা 2: আমি উপরের পদ্ধতিটির সাথে এটির কাজ পেয়েছি। কোনও কারণে এটি প্রথমে ছিল না (সম্ভবত মেটা_কি সেট করা হয়েছিল ... আমি জানি না)।

add_action('pre_get_posts', 'add_trending_sort', 11, 1);
function add_trending_sort($query){
  // Bail if not the main "hidden" query, as opposed to a 'new WP_Query()' call
  if(!$query->is_main_query())
    return;

  // Set meta_query to get shares for orderby, and also get non-shared content.
  $query->set('meta_query', array(
    'relation' => 'OR',
    array(
      'key' => 'TRENDING',
      'compare' => 'NOT EXISTS',
    ),
    array(
      'key' => 'TRENDING',
      'compare' => 'EXISTS',
    )
  ));
  //$query->set('meta_key', NULL);
  $query->set('orderby', array('meta_value_num' => 'DESC', 'date' => 'DESC'));
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.