মেটা মান অনুসারে বাছাই করুন তবে এমন পোস্টগুলি অন্তর্ভুক্ত করুন যার একটি নেই


37

আমি pre_get_postsফিল্টারটি ব্যবহার করে বিল্ট-ইন ডাব্লুপি অনুসন্ধানটি সংশোধন করছি , ব্যবহারকারীকে বিভিন্ন ক্ষেত্র দ্বারা পোস্টগুলি (কাস্টম পোস্টের ধরণ সহ) বাছাই করার অনুমতি দিয়েছি ।

আমার সমস্যাটি হ'ল আমি যখন ডাব্লুপিপিকে একটি মেটা মান অনুসারে বাছাই করতে বলি তখন সেই সমস্ত মেটাও বাদ দেওয়া হবে যা মেটা মান সেট করে না। যদি আপনি "দাম" থেকে "তারিখ" হিসাবে বাছাই করে পরিবর্তনগুলি পরিবর্তন করেন তবে "পোস্টস" এর "মূল্য" সেট নেই তবে "আইটেম" রয়েছে results

এটি আমি যা চাই তা নয়, তাই আমি জানতে চাই যে সমস্ত পোস্ট অন্তর্ভুক্ত করার কোনও উপায় আছে কিনা - এমনকি আমি যে মেটা মানটি বাছাই করছি তারও অভাব আছে - এবং মানটি ছাড়াই নিজের পোস্টটি রাখি।

আমি একাধিক ক্ষেত্রে কীভাবে বাছাই করতে জানি তা কিন্তু কার্যকর হয় না।

ধন্যবাদ

মনে হচ্ছে এই প্রশ্নটির সাথে আমিই একমাত্র নই: ডাব্লুপি_কোয়ারির জন্য যুক্তিগুলিতে নির্দিষ্ট মেটা_কি ছাড়া এবং উভয়ই পোস্ট যুক্ত করার উপায়? কিন্তু সেখানে কোন সমাধান নেই।

হালনাগাদ

আমি উত্তরটি চেষ্টা করেছি তবে আমি সঠিকভাবে বুঝতে পেরেছি কিনা তা নিশ্চিত নই, আমার এখনই যা আছে তা এখানে:

<?php
function my_stuff ($qry) {
    $qry->set('meta_query', array(array(
        'key' => 'item_price', 
        'value' => '', 
        'compare' => 'NOT EXISTS'
    )));

    $qry->set('orderby', 'meta_value date'); # Sorting works with meta_value as well as meta_value_num - I've tried both
    $qry->set('order', 'ASC DESC');
    $qry->set('meta_key', 'item_price');
}

মেটা মান হ'ল একটি সংখ্যা (এটি নাম অনুসারে দাম সঞ্চয় করতে ব্যবহৃত হয়)

আপডেট 2

আমি অর্ডার-স্টাফ মন্তব্য করেছি এবং আমার এখন যা আছে তা হ'ল:

<?php
$qry->set('meta_query', array(array(
    'key' => 'item_price', 
    'value' => '', 
    'compare' => 'NOT EXISTS'
)));

এই কোডটি দিয়ে ক্যোরিয়াকে এমন সমস্ত পোস্ট ফেরত দেওয়া হবে যাতে item_priceকী নেই এবং যে পোস্টগুলি নেই সেগুলির কোনওই নেই। IE সমস্যা এখন বিপরীত।

যদি আমি পাশাপাশি অর্ডার-কোড যুক্ত করি তবে আমি 0 টি ফলাফল পেয়েছি।

সম্পাদনা: ... তিন বছর পরে ... : পিআই আবার এই সমস্যা ছিল। আমি প্রদত্ত সমস্ত উত্তর চেষ্টা করেছিলাম এবং কোনওটিই কাজ করে না। কিছু লোকের মনে হয় কেন তারা কাজ করে বলে মনে হয় তবে তারা আমার পক্ষে কমপক্ষে কাজ করে না।

আমি যে সমাধানটি দিয়ে শেষ করেছিলাম তা হ'ল save_postফিল্টারটি ব্যবহার করে - তা নিশ্চিত করে যে সমস্ত পোস্টের কাস্টম ক্ষেত্রটি আমার বাছাই করতে চায়। এটি কিছুটা বিরক্তিকর আমার করতে হবে, তবে যতক্ষণ না আপনি তা তাড়াতাড়ি করবেন আপনার সম্ভবত কোনও সমস্যা হবে না।

এই ক্ষেত্রে আমি পোস্টগুলিতে একটি "ভিউ কাউন্টার" তৈরি করেছিলাম এবং ব্যবহারকারীরা সর্বাধিক পঠিত পোস্টগুলিতে বাছাই করতে সক্ষম হতে চেয়েছিলেন। আবার, যে পোস্টগুলি কখনও দেখা যায় নি (আমার ধারণা এটি সম্ভবত অসম্ভব - তবে এখনও) ভিউ কাউন্ট অনুসারে বাছাই করার পরে অদৃশ্য হয়ে গেছে। সমস্ত পোস্টের একটি ভিউ গণনা আছে তা নিশ্চিত করতে আমি এই বিট কোডটি যুক্ত করেছি:

add_action('save_post', function ($postId) {
    add_post_meta($postId, '_sleek_view_count', 0, true);
});

আমাদের আপনার কোড প্রদর্শন করুন। উত্তর দেওয়া সহজ করে তোলে।
কায়সার

প্রথম: meta_query এবং tax_queryহয় সবসময় একটি array( array() )হিসাবে তারা একাধিক অ্যারে একত্র করি। দ্বিতীয় - আমার উত্তর হিসাবে উল্লিখিত - আপনি meta_value_numসংখ্যা জন্য ব্যবহার করা প্রয়োজন । এটির পাশাপাশি প্রকৃতপক্ষে সংজ্ঞা দেওয়ার meta_value_numজন্য WP_Queryএটিও প্রয়োজন হতে পারে (দেখুন কোডেক্স পৃষ্ঠাটি প্রবেশ করুন)। সর্বশেষ, এটি জানার জন্য না orderযে ASC DESC দিক। এটা সম্ভব না. স্পেস ডিলিমিটার কেবল তার জন্য কাজ করে orderbyএবং আপনি এটি প্রথম ASCএবং দ্বিতীয়টি বাছাই করতে বলতে পারবেন না DESC। যে কি posts_clausesফিল্টার জন্য।
কায়সার

এবং নিশ্চিত হয়ে নিন যে আপনার meta_value_numএন্ট্রিগুলি আসল সংখ্যা। এটি প্রায়শই দেখা গেছে যে কেউ বলেছেন যে এটি একটি সংখ্যা, তবে বাস্তবে এটি ডাটাবেসের একটি স্ট্রিং হিসাবে সংরক্ষণ করছে।
কায়সার

আপনার সহায়তার জন্য ধন্যবাদ, আমি এটি চেষ্টা করব এবং আপনার কাছে ফিরে আসব। কারণ ASC DESCএটি উপর প্রকারের তাই meta_valueASCএবং dateDESC, যতটা আমি বলতে পারেন এটি কাজ করে।
পাওয়ারবয়

1
নিবন্ধন করুন আমার কাস্টম পোস্ট ধরণের কয়েকটিতে এই মান সেট রয়েছে। কিছু না। এবং বিল্ট ইন পোস্ট টাইপগুলি (যেমন POST এবং PAGE) দেয় না। সুতরাং যখনই আমি সেই কাস্টম ফিল্ডটি বাছাই করার চেষ্টা করি কেবলমাত্র কাস্টম ফিল্ড প্রদর্শিত হবে posts
পাওয়ারবুই 18

উত্তর:


4

এর দুটি সম্ভাব্য সমাধান রয়েছে:

1. সমস্ত পোস্ট মেটা আছে

আমি এখানে সবচেয়ে ভাল সমাধানটি খুঁজে পেয়েছি তা হল বাকি পোস্টগুলি / পণ্যগুলিকে 0 এর আইটেম দাম দেওয়া You আপনি নিজেই এটি করতে পারেন, বা সমস্ত পোস্টের মধ্য দিয়ে লুপ করতে পারেন এবং দাম খালি থাকলে আপডেট করুন।

ভবিষ্যতে এটি পরিচালনাযোগ্য করার জন্য আপনি save_postপ্রথমে যুক্ত হওয়ার পরে তাদের এটিকে মূল্য দিতে এবং এটিকে মান দিতে পারেন (কেবল এটি ফাঁকা থাকলেই)।

2. একাধিক প্রশ্ন

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

তারপরে আপনি দুটি ফলাফল আলাদাভাবে অর্ডার করতে পারেন এবং আপনি পছন্দসই ফলাফল পাবেন।


1
তিন বছর পরে এবং আমার আবার একই সমস্যা ছিল: পি save_postপদ্ধতিটি ব্যবহার করতে হয়েছিল (আমি যে কোডটি ব্যবহার করেছি তা দিয়ে আমি আমার প্রশ্ন আপডেট করেছি)।
পাওয়ারবয়

10

ইজি প্যাসি, বর্তমানে উত্পাদনে ব্যবহার করে সবেমাত্র 2018 টি পরীক্ষা করা হয়েছে।

$query->set( 'meta_query', array(
    'relation' => 'OR',
    array(
        'key' => 'custom_meta_key', 
        'compare' => 'EXISTS'
    ),
    array(
        'key' => 'custom_meta_key', 
        'compare' => 'NOT EXISTS'
    )
) );
$query->set( 'orderby', 'meta_value title' ); 

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

ব্যবহারিক উদাহরণ

/**
 * Modifies query before retrieving posts. Sets the 
 * `meta_query` and `orderby` param when no `orderby` 
 * param is set, (default ordering).
 * 
 * @param   WP_Query  $query  The full `WP_Query` object.
 * @return  void
 */
function example_post_ordering( $query ) {

    // if not in wp-admin, 
    // and the query is the main query, 
    // and the query is not a singular query, 
    // and the query does not have an orderby param set...
    // Note: check for post types, etc. here as desired.
    if ( ! is_admin() 
    && $query->is_main_query() 
    && ! $query->is_singular() 
    && empty( $query->get( 'orderby' ) ) ) {

        // Setting just `meta_key` is not sufficient, as this 
        // will ignore posts that do not yet, or never will have 
        // a value for the specified key. This meta query will 
        // register the `meta_key` for ordering, but will not 
        // ignore those posts without a value for this key.
        $query->set( 'meta_query', array(
            'relation' => 'OR',
            array(
                'key' => 'custom_meta_key', 
                'compare' => 'EXISTS'
            ),
            array(
                'key' => 'custom_meta_key', 
                'compare' => 'NOT EXISTS'
            )
        ) );

        // Order by the meta value, then by the title if multiple 
        // posts share the same value for the provided meta key.
        // Use `meta_value_num` if the meta values are numeric.
        $query->set( 'orderby', 'meta_value title' );
    }

}

add_action( 'pre_get_posts', 'example_post_ordering', 10 );

এটি custom_meta_keyডিফল্ট দ্বারা পোস্টগুলি অর্ডার করবে এবং সেই কীটির কোনও মান ছাড়াই পোস্টগুলি উপেক্ষা করবে না।


কেবল কোডটি পড়া থেকে, যা কিছু মনে হয় তা হ'ল এমন পোস্টগুলি পাওয়া custom_meta_keyএবং যাঁর কাছে নেই সেগুলি পাওয়া custom_meta_key। বাছাই সহ একটি প্রকৃত কাজের উদাহরণ অন্তর্ভুক্ত নির্দ্বিধায়।
পাওয়ারবাই

1
আপনি ঠিক বলেছেন, এটিই সমস্ত করছে, তবে নীচের লাইনটি মেটা_ভ্যালু (মেটা কীটি সন্ধান করা হচ্ছে) দ্বারা অর্ডার করার জন্য দায়ী। $query->set( 'orderby', 'meta_value title' );(মেটা মান অনুসারে অর্ডার করুন, তারপরে শিরোনাম অনুসারে যখন একাধিক পোস্টের মেটা কীর জন্য একই মান থাকে)। ভেরিয়েবলটিতে pre_get_postsপাস ব্যবহার করে এটি হুকের মধ্যে করা উচিত $query। যে মেটা কীটির কোনও মান নেই এমন পোস্টগুলিকে উপেক্ষা না করে জিজ্ঞাসিত প্রশ্নটি মনে রাখবেন কীভাবে মেটা মান অনুসারে অর্ডার করবেন।
noahmason

@ পাওয়ারবুয় আপডেটেড ব্যবহারিক উদাহরণ দেখুন
নোহামসন

ঠিক আছে, পরের বার যখন আমি এই সমস্যার মুখোমুখি হচ্ছি তখন আমি এটিকে একবার দেব।
পাওয়ারবয় ২r

1
শীর্ষে মেটা get_posts()সহ পোস্টগুলি সরানোর জন্য একটি কাস্টম কলে আমার জন্য কাজ করেছেন _featured, তারপরে তারিখ অনুসারে অর্ডার করুন। ধন্যবাদ!
natebeaty

8

এই পদ্ধতিটি অনুরোধকৃত এবং অনুরোধ ছাড়া সকল সহ সমস্ত পোস্ট ফিরিয়ে দেবে meta_key, তবে অর্ডার দেওয়ার সময় এটি অদ্ভুত কাজ করবে।

add_action('pre_get_posts', 'my_stuff');
function my_stuff ($qry) {
    $qry->set(
        'meta_query',
        array(
            'relation' => 'OR', # Matches to this meta_query should be added to those matching the 'meta_key' query
            array(
                'key' => 'item_price', 
                'value' => 'bug #23268', 
                'compare' => 'NOT EXISTS'
            )
        )
    );

    $qry->set('orderby', 'meta_value date'); # Sorting works with meta_value as well as meta_value_num - I've tried both
    $qry->set('order', 'ASC DESC');
    $qry->set('meta_key', 'item_price');
}

আমি এই প্রশ্নের সমস্ত বিভিন্ন উত্তর দিয়ে চারপাশে বিচলিত হয়েছি এবং পরীক্ষার এবং ত্রুটির মাধ্যমে উত্পন্ন এসকিউএল বিশ্লেষণ করে খুঁজে পেয়েছি । দেখে মনে হয় এর পরিবর্তে array('meta_query' => array('relation' => 'OR'))একটি উপযুক্ত আউটপুট সেট করা মেটাডেটা অনুপস্থিত পোস্টগুলিকে অন্তর্ভুক্ত করা প্রয়োজন। মেটা ক্ষেত্রের অভাবযুক্ত পোস্টগুলি ফিল্টার করা থেকে ক্লজটিকে বাধা দেয় ifying এই বিশেষের জন্য , উত্পন্ন এসকিউএল হ'ল (ইনডেন্টেশন / নতুনলাইন যুক্ত):LEFT JOININNER JOINNOT EXISTSWHEREWP_Query

SELECT SQL_CALC_FOUND_ROWS
    wp_posts.ID
    FROM wp_posts
    INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
    INNER JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id
    LEFT JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id AND mt1.meta_key = 'item_price')
    WHERE 1=1
    AND ( wp_term_relationships.term_taxonomy_id IN (2) )
    AND wp_posts.post_type = 'post'
    AND (wp_posts.post_status = 'publish'
        OR wp_posts.post_status = 'private')
    AND (wp_postmeta.meta_key = 'item_price'
        -- Oh look, here we give SQL permission to choose a random
        -- row from wp_postmeta when this particular post is missing
        -- 'item_price':
        OR  mt1.post_id IS NULL )
    GROUP BY wp_posts.ID
    ORDER BY wp_postmeta.meta_value,wp_posts.post_date DESC
    LIMIT 0, 10

ফলাফলটি মেটা_ভ্যালু item_priceএবং নিখোঁজ থাকা সমস্ত পোস্টের একটি তালিকা item_price। সহ সমস্ত পোস্ট item_priceএকে অপরের সাথে যথাযথভাবে অর্ডার করা হবে, তবে অনুপস্থিত পোস্টগুলি এর item_priceজন্য কিছু এলোমেলো অন্যান্য মেটা মান ব্যবহার করবে (বলুন, _edit_lastযা 1আমার ডেটাবেজে বা অন্য কোনও অভ্যন্তরীণ ওয়ার্ডপ্রেস মেটাডেটাতে প্রায়শই মনে হয় ) এটির জন্যwp_postmeta.meta_value জন্য ORDER BYদফা। সুতরাং, যদিও এই পদ্ধতিটি নিকটবর্তী এবং নির্দিষ্ট ডেটার জন্য কাজ করতে প্রদর্শিত হতে পারে, এটি ভেঙে গেছে। সুতরাং, আমি কেবল এটিই বলতে পারি, যদি আপনার item_priceমানগুলি এলোমেলো মেটা ক্ষেত্রগুলি মাইএসকিউএল পোস্টগুলি হারিয়ে যাওয়ার জন্য চয়ন করে তবে এটি item_priceআপনার পক্ষে ভাল কাজ করতে পারে। আপনার যা দরকার তা হ'ল একটি গ্যারান্টি যা আপনার পোস্টগুলি সহitem_priceঅন্য পোস্টের অর্ডার বিবেচনা না করে একে অপরের সাথে সম্পর্কিতভাবে সঠিকভাবে অর্ডার করা হয়, এটি ঠিক আছে be তবে আমি মনে করি এটি কেবল ওয়ার্ডপ্রেসে একটি ঘাটতি। দয়া করে আমাকে সংশোধন করুন, আমি আশা করি আমি ভুল এবং এটির সমাধানের একটি উপায় আছে ;-)।

মনে হয় যে INNER JOIN wp_postmetaমাইএসকিউএল postmetaপোস্টের সাথে যুক্ত একাধিক সারির মধ্যে থেকে একটি এলোমেলো সারিটি চয়ন করছে যখন meta_keyপ্রদত্ত পোস্টটি অনুপস্থিত রয়েছে। একটি এসকিউএল দৃষ্টিকোণ থেকে, আমাদের কীভাবে ওয়ার্ডপ্রেসকে আউটপুট বলতে হবে তা নির্ধারণ করতে হবে ORDER BY mt1.meta_value। এই কলামে সঠিকভাবে হয় NULLযখন আমাদের অনুরোধ meta_keyঅনুপস্থিত মতো wp_postmeta.meta_value। যদি আমরা এটি করতে পারি, এসকিউএল NULLঅন্য কোনও মানের আগে এইগুলি (নিখোঁজ এন্ট্রি) বাছাই করে আমাদের একটি সুসংজ্ঞায়িত ক্রম দিয়েছিল: প্রথমে নির্দিষ্ট পোস্টমেটা ক্ষেত্রটি অনুপস্থিত সকল পোস্ট আসুন, দ্বিতীয়ত ক্ষেত্রযুক্ত পদগুলি আসবে come তবে এটিই পুরো সমস্যা: 'orderby' => 'meta_value'কেবলমাত্র উল্লেখ করা যেতে পারে 'meta_key' => 'item_price' এবং অরক্ষিত wp_postmetaসবসময় সর্বদা এর INNER JOINপরিবর্তে হয় LEFT JOIN, অর্থwp_postmeta.meta_value এবং wp_postmeta.meta_keyকরতে পারেনকখনও হবে নাNULL

সুতরাং আমার অনুমান যে আমার বলতে হবে যে ওয়ার্ডপ্রেস অন্তর্নির্মিত WP_Queryএটি এখন সম্ভব নয়, কারণ এটি এখন নথিভুক্ত করা হয়েছে (ওয়ার্ডপ্রেস -৩.৯.১ এ)। বিরক্ত। সুতরাং আপনার যদি এটি সঠিকভাবে কাজ করার প্রয়োজন হয় তবে আপনার সম্ভবত অন্য কোথাও ওয়ার্ডপ্রেসে প্রবেশ করা এবং উত্পন্ন এসকিউএলকে সরাসরি সংশোধন করা দরকার


খুব প্রতিশ্রুতিবদ্ধ দেখাচ্ছে! আমি এই সমস্যাটি পরের বার চেষ্টা করব। আমি এখনই আপনাকে উত্তরটি দিতে চাই, তবে এটি আগে আমার পক্ষে কাজ করে তা নিশ্চিত করতে পছন্দ করি।
পাওয়ারবয়

এটি আমার কাছে উপস্থিতি দেখাতে বাধা দেয়। এটি বাস্তবায়নের পরে কিছুই দেখানো হয়নি।
জেক

@ জ্যাক হ্যাঁ এখানে একই। আজ আবার এই সমস্যা ছিল এবং এটি চেষ্টা করে। 0 টি ফলাফল দেয়।
পাওয়ারবয়

আপনি ছেলেরা ওয়ার্ডপ্রেসের কোন সংস্করণ ব্যবহার করছেন? আমি মনে করি এই পোষ্টটি বর্ণনা করে যে কীভাবে একটি অভ্যন্তরীণ, অননুমোদিত API ব্যবহার করা যায় যা ওয়ার্ডপ্রেস দ্বারা সমর্থিত নয় এবং সম্ভবত আপনি যদি ওয়ার্ডপ্রেস -৩.৯.১ এ থাকেন বা এর বাইরেও খুব বেশি সংস্করণ না রাখেন তবেই কাজ করে।
বিনকি

2

আমি মনে করি আমার একটি সমাধান আছে।

আপনি দুটি meta_keyপোস্ট ব্যবহার করতে পারেন , সমস্ত পোস্টে একটি (like "_thumbnail_id")এবং meta_keyআপনি ফিল্টার হিসাবে ব্যবহার করতে চান।

সুতরাং আপনার আরগস:

$qry->set(
    'meta_query',
    array(
        'relation' => 'OR',
        array(
            'key' => 'item_price', 
            'value' => '', 
            'compare' => 'EXISTS'
        ),
        array(
            'key' => 'item_price', 
            'value' => '', 
            'compare' => 'EXISTS'
        )
    )
);

$qry->set('orderby', 'meta_value date'); # Sorting works with meta_value as well as meta_value_num - I've tried both
$qry->set('order', 'ASC DESC');
$qry->set('meta_key', 'item_price');

1
এখানে সমস্যা খালি স্ট্রিং তুলনা হয়, এটি অপসারণ এবং এটি কাজ করে 'value' => '', এছাড়াও দ্বিতীয় তুলনা হওয়া উচিত NOT EXISTSএবং গত সেট নির্দেশ প্রয়োজন হয় না
nodws

2

এখানে প্রত্যেকের যে সমস্যাটি হচ্ছে তা মেটা প্রশ্নের ক্রম অনুসারে করতে হবে। সঠিকভাবে বাছাই করতে আপনার "উপস্থিতি" ক্যোয়ারির আগে "না উপস্থিত রয়েছে" ক্যোয়ারী রাখা দরকার ।

এর কারণ হ'ল ওয়ার্ডপ্রেস "অর্ডার বাই" ধারাটিতে সর্বশেষ "লেফট যোগ" বিবৃতিটির মেটা_ভ্যালু ব্যবহার করে।

উদাহরণ স্বরূপ:

$pageQuery = new WP_Query([
    'meta_query' => [
        'relation' => 'OR',
        ['key' => 'item_price', 'compare' => 'NOT EXISTS'], // this comes first!
        ['key' => 'item_price', 'compare' => 'EXISTS'],
    ],
    'order' => 'DESC',
    'orderby' => 'meta_value_num',
    'post_status' => 'publish',
    'post_type' => 'page',
    'posts_per_page' => 10,
]);

1

যদি উপযুক্ত হয় তবে প্রতিবার কোনও পোস্ট সংরক্ষণ বা আপডেট হওয়ার পরে আপনি একটি ডিফল্ট মেটা মান যুক্ত করতে পারেন, যদি মেটা মানটি উপস্থিত না থাকে।

function addDefaultMetaValue($post_id) {
    add_post_meta($post_id, 'item_price', 0, true);
}
add_action('save_post', 'addDefaultMetaValue');

আপনি যদি একটি কাস্টম পোস্ট টাইপ ব্যবহার করে থাকেন, প্রতিস্থাপন add_action('save_post', 'addDefaultMetaValue');দ্বারা add_action('save_post_{post_type}', 'addDefaultMetaValue');যেমনadd_action('save_post_product', 'addDefaultMetaValue');


1

সংখ্যাযুক্ত মেটা মানগুলির জন্য আমার নিজের দ্বারা সমস্যা ছিল এবং এটি নির্দেশ করে যে এটি প্রশ্নের ক্রমটিও গুরুত্বপূর্ণ। আমার জন্য NOT EXISTSক্যোয়ারীটি প্রথমটি হতে হবে।

উদাহরণ:

$query->set( 'orderby', 'meta_value_num' );
$query->set( 'meta_query', [
    'relation' => 'OR',
    [ 'key' => 'your_meta_name', 'compare' => 'NOT EXISTS' ],
    [
        'key' => 'your_meta_name',
        'compare' => 'EXISTS',
    ],
] );

সংখ্যার মানগুলির জন্য সঠিক দিকনির্দেশ পাওয়ার জন্য গুরুত্বপূর্ণটি ’orderby’সেট করা থাকে ’meta_value_num’। অন্যথায় আপনার কাছে সংখ্যাসূচক মানের জন্য অদ্ভুত ফলাফল রয়েছে, যেমন:

1, 2, 20, 21, 3, 4, 5…

পরিবর্তে:

1, 2, 3, 4, 5… 20, 21


1

আমিও একই ধরণের সমস্যার মুখোমুখি হয়েছি এবং নিম্নলিখিত সমাধানগুলি আমাকে সহায়তা করেছে:

$args = array(
'post_type' => 'kosh_products',
'posts_per_page' => -1,
'meta_query' => array(
    'relation' => 'OR',
    'category_sort_order' => array(
        'key' => '_sort_order',
        'compare' => 'EXISTS'
    ),
    'category_sort_order_not_exists' => array(
        'key' => '_sort_order',
        'compare' => 'NOT EXISTS'
    ), 
),
'orderby' => array( 
    'category_sort_order' => 'ASC',
    'date' => 'ASC'
));
$query = new WP_Query( $args );

আমি ওয়ার্ডপ্রেস কোডেক্সে একাধিক 'মেটা_কি'র " ' অর্ডারবাই ' শিরোনাম সহ একটি বিবরণ পেয়েছি : https://codex.wordpress.org/Class_References/WP_Query# অর্ডার_.26_অর্ডার_প্যারামিটার এখানে চিত্র বর্ণনা লিখুন


0

এর জন্য একটি সম্ভাব্য orderbyমান আছে meta_value

$query = new WP_Query( array ( 
    'meta_key'   => 'your_keys_name',
    'orderby'    => 'meta_value',
    'order'      => 'DESC',
    'meta_query' => array( array(
         'key'     => 'your_meta_key',
         'value'   => '',
         'compare' => 'NOT EXISTS',
         // 'type'    => 'CHAR',
    ) )
) );

যদি আপনি সংখ্যার মান পেয়ে থাকেন তবে কেবল meta_value_numপরিবর্তে ব্যবহার করুন।

দাবি অস্বীকার: এটি পরীক্ষিত নয়, তবে এটি কাজ করা উচিত । পয়েন্ট হ'ল আপনাকে নিজের meta_keyএবং keyমানগুলি নির্দিষ্ট করতে হবে । অন্যথায় আপনি অ-বিদ্যমান মানের সাথে তুলনা করতে পারবেন না, যা উভয় প্রকারের পোস্টকে জিজ্ঞাসা করা সম্ভব করে। এটি একরকম হ্যাক-ইশ, তবে যতক্ষণ না এটি কাজ করে ...


আপনার উত্তরের জন্য ধন্যবাদ, আমার আপডেট হওয়া প্রশ্নটি পরীক্ষা করে দেখুন, আমি আপনাকে সঠিকভাবে বুঝতে পেরেছি তা নিশ্চিত নই।
পাওয়ারবয়

আমি এখনও এই কাজটি করি নি তাই আপনার যদি সমাধান থাকে তবে আমি ভুল করছি তা জানতে আগ্রহী। : এছাড়াও, আমি তাই একটা খয়রাত সেট যদি আপনি এটি দাবি করার বিষয়ে stackoverflow.com/questions/17016770/...
powerbuoy

1
দুটি জিনিস. 'your_keys_name'এবং 'your_meta_key'উভয় পৃথক পরিবর্তে একই স্ট্রিং হওয়া উচিত, অন্যথায় দেখে মনে হচ্ছে আপনি প্রশ্নটি ভুল বুঝেছেন। দ্বিতীয়ত, আমি এটি আমার স্থানীয় সেটআপে পরীক্ষা করেছি এবং এটি কোনও পোস্টকে বাদ দেয় যেখানে চাবিটি উপস্থিত থাকে (এর মাধ্যমে meta_query) এবং এমন কোনও পোস্টকে বাদ দেয় যেখানে কীটি অনুপস্থিত থাকে ( meta_keyযার মাধ্যমে ) ফলে কোনও পোস্ট দেখানো হয় না। যাইহোক, এই উত্তরটি এমন কোনও কিছুর দিকে পদক্ষেপ যা কমপক্ষে ;-) বলে words
বিনকি

1
ওহ, মজার ব্যাপার, এই উত্তর কাজ আপনি শুধু যোগ করেন 'relation' => 'OR'করার meta_query। অসামান্য স্টাফ ও_ও।
বিনকি

@ বিঙ্কি শুধু আমার প্রশ্নের একটি সম্পাদনা ফাইল করুন এবং আপনার মনে হয় যে বিটগুলি পরিবর্তন করা উচিত change এটি একটি সম্প্রদায় চালিত সাইট :)
কায়সার

0

আমি মনে করি @kaiser করার চেষ্টা ছিল কি ডামি কেমন প্রয়োগের দ্বারা সকল পোস্ট আছে যে মেটা কী ফিরে যাওয়ার ক্যোয়ারী বলতে ছিল যেখানে শর্ত থেকে না ঐ পোস্টগুলির যে কোনও ফিল্টার করুন। সুতরাং, যদি আপনি নিজের কাস্টম ক্ষেত্রগুলি গ্রহণ করতে পারে এমন সমস্ত মানগুলি x, y, z বুঝতে পারেন তবে আপনি "WHETE meta_key IN (x, y, z) " বলতে পারেন তবে এই ধারণাটি আপনি একসাথে এই সমস্যাটি এড়াতে পারবেন ! = (' ') :

$query = new WP_Query( array ( 
    'orderby'    => 'meta_value_num',
    'order'      => 'DESC',
    'meta_query' => array( array(
         'key'     => 'item_price',
         'value'   => '',
         'compare' => '!=',
    ) )
) );

এটিও পরীক্ষিত নয় তবে মনে হচ্ছে এটি চেষ্টা করার মতো :-)।


1
এখনই এটি সত্যিই পরীক্ষা করা যায় না, তবে এটি নিশ্চিত যে কেবলমাত্র সেই পোস্টগুলিতে ফিরে আসবে যেখানে আইটেম_প্রাইস সেট করা আছে এবং এটি 'নয়'।
পাওয়ারবয়

0

আমি কিছুটা হ্যাক (আইএমএইচও) দিয়ে এটিকে ঘুরে দেখলাম, তবে এটি আমার ক্ষেত্রে কাজ করেছে।

মধ্যে আপনি যে ফিল্টারগুলি হুক করতে পারেন posts_join_paged এবং posts_orderby যোগদানের শৃঙ্খলা স্ট্রিং আপডেট করার জন্য। এটি আপনাকে WP_Query এর পরিবর্তে ক্ষেত্রটি নির্দিষ্ট পোস্টের জন্য থাকতে হবে তা ধরে নেওয়ার পরিবর্তে প্রথমে যোগদানের আগে যা কিছু চাইবেন তা অর্ডার করার অনুমতি দেবে। এর পরে আপনি অপসারণ করতে পারেন meta_key, orderbyআপনার WP_Query args থেকে এবং `অর্ডার।

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

এই দুটি ফিল্টারের ডকুমেন্টেশনে দুঃখের সাথে তাই অভাব রয়েছে ... শুভকামনা! :)

add_filter('posts_join_paged', 'edit_join', 999, 2);
add_filter('posts_orderby', 'edit_orderby', 999, 2);

/**
 * Edit join
 *
 * @param string $join_paged_statement
 * @param WP_Query $wp_query
 * @return string
 */
function edit_join($join_paged_statement, $wp_query)
{
    global $wpdb;
    if (
        !isset($wp_query->query)
        || $wp_query->is_page
        || $wp_query->is_admin
        || (isset($wp_query->query['post_type']) && $wp_query->query['post_type'] != 'my_custom_post_type')
    ) {
        return $join_paged_statement;
    }

    $join_to_add = "
        LEFT JOIN {$wpdb->prefix}postmeta AS my_custom_meta_key
            ON ({$wpdb->prefix}posts.ID = my_custom_meta_key.post_id
                AND my_custom_meta_key.meta_key = 'my_custom_meta_key')
    ";

    // Only add if it's not already in there
    if (strpos($join_paged_statement, $join_to_add) === false) {
        $join_paged_statement = $join_paged_statement . $join_to_add;
    }

    return $join_paged_statement;
}

/** 
 * Edit orderby
 *
 * @param string $orderby_statement
 * @param WP_Query $wp_query
 * @return string
 */
function edit_orderby($orderby_statement, $wp_query)
{
    if (
        !isset($wp_query->query)
        || $wp_query->is_page
        || $wp_query->is_admin
        || (isset($wp_query->query['post_type']) && $wp_query->query['post_type'] != 'my_custom_post_type')
    ) {
        return $orderby_statement;
    }

    $orderby_statement = "my_custom_meta_key.meta_value DESC";

    return $orderby_statement;
}

কোড কাজ করে। তবে মেটা_ভ্যালুটি স্ট্রিং হিসাবে পরিচালিত হয়। 6 জনকে 50 হিসাবে উচ্চতর রেট দেওয়া হয়েছে them তাদের সংখ্যার হিসাবে বিবেচনা করার জন্য কোনও পরিবর্তন সম্ভব?
ড্রাইভিং 2

@ ড্রাইভিংর্যান্টের কৌশলটি করা cast(my_custom_meta_key.meta_value as unsigned) DESCউচিত ...
tfrommen ২২ শে

1
ধন্যবাদ @ থিম থেকে। $orderby_statement = "cast(my_custom_meta_key.meta_value as unsigned) DESC";দুর্দান্ত কাজ করে
ড্রাইভিং 16

0

এই সমাধানটি আমার পক্ষে কাজ করেছে:

add_action( 'pre_get_posts', 'orden_portfolio' );
function orden_portfolio( $query ) {

    if( ! is_admin() ) {

        $query->set( 'orderby', 'meta_value_num' );
        $query->set( 'order', 'ASC' );
        $query->set( 'meta_query', [
            'relation' => 'OR',
            [ 
                'key' => 'ce_orden', 
                'compare' => 'NOT EXISTS' ],
            [
                'key' => 'ce_orden',
                'compare' => 'EXISTS',
            ],
        ] );

        return $query;

    }

}

যাইহোক, এই সমাধানটি প্রথমে নাল মেটা_ভ্যালু সহ রেকর্ডগুলি দেখায়। এই অন্যান্য সমাধানটি ASC অর্ডার এবং নালগুলি শেষে দেখায়:

function custom_join($join) {
    global $wpdb;

    if( ! is_admin() ) {
        $join .= $wpdb->prepare(
        ' LEFT JOIN ' . $wpdb->postmeta . ' cpm ON cpm.post_id = ' . $wpdb->posts . '.ID AND cpm.meta_key = %s'
        , 'ce_orden' );
    }

    return $join;
}

add_filter('posts_join','custom_join');

function custom_orderby($orderby_statement){
    global $wpdb;

    if ( ! is_admin() ) {
        $orderby_statement = "CAST( COALESCE(cpm.meta_value,99999) as SIGNED INTEGER) ASC";
    }

    return $orderby_statement;
}

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