মেটা মান বা তারিখ দ্বারা অর্ডার?


10

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

// if meta_key _postmeta.startDate isn't set get the rest by posts.post_date

query_posts(
    array(
        array(
            'posts_per_page' => 10,
            'meta_key' => 'startDate',
            'meta_value' => date('Y-m-d'),
            'meta_compare' => '<',
            'orderby' => 'meta_value',
            'order' => 'ASC'
        ), 
        array(
            'meta_key' => 'post_date',
            'meta_value' => date('Y-m-d'),
            'meta_compare' => '<'
        )
    )
);

পোস্ট_ডেট একটি কাস্টম ক্ষেত্র?
বেন্টারনেট

আমি ডাব্লুএস এর ডিফল্ট ওয়ার্ডপ্রেস প্রকাশিত ক্ষেত্রটি ধরে নিয়েছি যদিও ভুল হতে পারে? যে কোনও উপায়ে আইডি ডিফল্ট তারিখটি ব্যবহার করতে পছন্দ করে ...
v3nt

ঠিক আছে সুতরাং এটি কোনও মেটা তার পোস্টের টেবিলে ফিল্ড নয়
বেন্টারনেট

আপনার কোয়েরি যুক্তিগুলি স্থির করে নিন, আশা করুন যে আপনি যা চিত্রিত করছেন তা ত্রুটিযুক্ত হয়নি, প্রয়োজনে দয়া করে ফিরে যেতে নির্দ্বিধায় অনুভব করুন।
t31os

চিয়ার্স t31os - এটি আরও পরিষ্কার করার জন্য এটি আবার সম্পাদনা করুন। এখনই স্টার্টডেট ব্যবহার করে পুরানো সামগ্রী নির্বাচন করা দরকার এবং আর যদি স্টার্ট ডেট সেট না করা থাকে তবে ডিফল্ট পোস্টের তারিখ পোস্ট_ডেট ব্যবহার করুন।
v3nt

উত্তর:


11

আপনি যদি এটি এসকিউএলে ব্যাখ্যা করতে পারেন তবে আপনি এটির জন্য জিজ্ঞাসা করতে পারেন! তিনটি জায়গা রয়েছে যেখানে আমরা ডিফল্ট ক্যোয়ারীটি পরিবর্তন করতে চাই:

SELECT wp_posts.*
FROM wp_posts 
INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id)
WHERE 1=1
    AND wp_posts.post_type = 'post'
    AND (wp_posts.post_status = 'publish')
    AND wp_postmeta.meta_key = 'startDate'
    AND CAST(wp_postmeta.meta_value AS CHAR) < '2011-03-23'
GROUP BY wp_posts.ID
ORDER BY wp_postmeta.meta_value DESC
LIMIT 0, 10
  • যোগদানটি বাম জোড় হওয়া উচিত
  • যেখানে-ধারা
  • ক্রম

যোগদান এবং যেখানে-ধারাটি ফাংশনের মাধ্যমে যুক্ত করা হয়_get_meta_sql() । আউটপুট ফিল্টার করা হয়, যাতে আমরা এটিতে ঝুঁকতে পারি:

add_filter( 'get_meta_sql', 'wpse12814_get_meta_sql' );
function wpse12814_get_meta_sql( $meta_sql )
{
    // Move the `meta_key` comparison in the join so it can handle posts without this meta_key
    $meta_sql['join'] = " LEFT JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = 'startDate') ";
    $meta_sql['where'] = " AND (wp_postmeta.meta_value IS NULL OR wp_postmeta.meta_value < '" . date('Y-m-d') . "')";
    return $meta_sql;
}

অর্ডার ক্লজ মাধ্যমে ফিল্টার করা হয় posts_orderby:

add_filter( 'posts_orderby', 'wpse12814_posts_orderby' );
function wpse12814_posts_orderby( $orderby )
{
    $orderby = 'COALESCE(wp_postmeta.meta_value, wp_posts.post_date) ASC';
    return $orderby;
}

এটি আমাদের নিম্নলিখিত এসকিউএল কোয়েরি দেয়:

SELECT wp_posts.*
FROM wp_posts
LEFT JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = 'startDate')
WHERE 1=1
    AND wp_posts.post_type = 'post'
    AND (wp_posts.post_status = 'publish')
    AND (wp_postmeta.meta_value IS NULL OR wp_postmeta.meta_value < '2011-03-23')
GROUP BY wp_posts.ID
ORDER BY COALESCE(wp_postmeta.meta_value, wp_posts.post_date) ASC
LIMIT 0, 10

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


2
খুব মার্জিত সমাধান, আমি এর মতো COALESCE ব্যবহার করার কথা ভাবিনি। আমি কেবলমাত্র 'wp_' উপসর্গটিকে ধরে না রেখে এবং পরিবর্তে {$ wpdb-> উপসর্গ using ব্যবহার না করার পরামর্শ দেব ...
সুবর্ণপ্লেস

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

থ্যাঙ্কস জান - এ তো চোখ খোলা! এখনও ওয়ার্ডপ্রেসের সাথে আঁকড়ে উঠছেন এবং ভাবছেন যে আমার পৃষ্ঠায় এটি কোথায় ডাকা হয়? এবং আমি কীভাবে এটি 'আন-হুক' করব? যেমন // $ দ্য কিউয়ারি ... তারপরে <? পিএইচপি যদি (has_posts ()) থাকে: যখন (has_posts ()): the_post (); ?>?
v3nt

@ ড্যানিয়েল: আপনি আপনার থিমের functions.phpফাইলটিতে ফাংশন রাখতে পারেন । তারপরে আপনি ক্যোয়ারি চালানোর ঠিক আগে আপনি দুটি add_filter()লাইন রাখুন। ক্যোয়ারির পরে আপনি remove_filter( 'get_meta_sql', 'wpse12814_get_meta_sql' ); remove_filter( 'posts_orderby', 'wpse12814_posts_orderby' );সেগুলি আবার মুছে ফেলতে লিখুন ।
জান ফ্যাব্রি

আহ - এগুলি এখনই বোধগম্য এবং খুব বেশি কাজ করছে! অনেক ধন্যবাদ জানু। Thats দরকারী হবে ...
v3nt

0

এর লাইনে কিছু চেষ্টা করুন:

$postedtime = get_post_meta($post->ID, 'startDate');

if($postedtime != null){
$orderby = $postedtime;

}else{
$orderby = 'date';
}

থ্যাঙ্কএক্স অ্যালেক্স তবে নিশ্চিত নয় কীভাবে এই লুপটি জড়িত?
v3nt

Doh! আপনি যখন কোয়েস্ট_পোস্টগুলি (অ্যারে ('অর্ডারবাই' => $ অর্ডারবাই)))
অ্যালেক্স

0

একটি ক্যোয়ারী পোস্ট কল দুটি নয়, কেবল একটি ক্যোয়ারী করে। সুতরাং না, আপনি এটি দুটি পৃথক ক্যোয়ারী তৈরি করতে পারবেন না এবং তারপরে ফলাফলগুলি সম্মতি জানাতে পারেন।

মনে রাখবেন, আপনি এখানে কিছু পোস্টের সেট নির্বাচন করছেন, তারপরে সেগুলি প্রদর্শন করছেন। সেই সেটটি একবারে নির্বাচিত হয়েছে। আপনি যদি দুটি পৃথক পোস্ট পেতে চান এবং সেগুলিতে মার্জ করতে চান, তবে এটি এমন কিছু যা আপনাকে নিজেরাই get_posts বা অনুরূপ করতে হবে।

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