কাস্টম পোস্ট প্রকার অনুসারে get_terms


19

আমার দুটি কাস্টম পোস্ট প্রকারের 'দেশ' এবং 'শহর' এবং একটি ভাগ করা শৈলী 'পতাকা' রয়েছে।

যদি আমি ব্যবহার করি:

<?php $flags = get_terms('flag', 'orderby=name&hide_empty=0');

আমি বিভাগে সমস্ত পদগুলির একটি তালিকা পেয়েছি, তবে আমি তালিকাটি 'দেশ' পোস্টের মধ্যে সীমাবদ্ধ করতে চাই।

আমি এটা কিভাবে করবো?


নতুন সমাধান ব্যবহার করে

<?php 
$flags = wpse57444_get_terms('flags',array('parent' => 0,'hide_empty' => 1,'post_types' =>array('country')));
foreach ($flags as $flag) {
    $childTerms = wpse57444_get_terms('flags',array('parent' => $flag->term_id,'hide_empty' => 1,'post_types' =>array('country')));
    foreach ($childTerms as $childTerm) {
        echo $childTerm->name.'<br />';
    }
}
?>

আমি $ চাইল্ডটার্ম-> নামের প্রতিধ্বনি করতে পারি না। কেন?


আপনি কি আরও পরিষ্কার হতে পারেন?
TheDeadMedic

উত্তর:


16

আমি আশঙ্কা করছি যে এটি স্থানীয়ভাবে সম্ভব নয় (এখনও?) এই ট্র্যাকটি দেখুন: http://core.trac.wordpress.org/ticket/18106

একইভাবে ট্যাক্সনমি অ্যাডমিন পৃষ্ঠায় পোস্ট গণনা সমস্ত পোস্টের প্রতিফলন ঘটায় । ( আমি নিশ্চিত যে এর জন্যও ট্র্যাকের টিকিট আছে ) http://core.trac.wordpress.org/ticket/14084

এছাড়াও দেখুন, এই সম্পর্কিত পোস্ট


নতুন সমাধান

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

ফাংশন হিসাবে একই আর্গুমেন্ট লাগে get_terms($taxonomies, $args)। পোস্টের ধরণের অ্যারে | স্ট্রিং $argsনেয় এমন অতিরিক্ত যুক্তি গ্রহণ করে post_types

তবে আমি গ্যারান্টি দিতে পারি না যে সবকিছু 'প্রত্যাশার মতো' কাজ করে (আমি গণনা চালানোর কথা ভাবছি)। এটা ঠিক ডিফল্ট ব্যবহার কাজ প্রদর্শিত হচ্ছে না $argsজন্য get_terms

function wpse57444_get_terms( $taxonomies, $args=array() ){
    //Parse $args in case its a query string.
    $args = wp_parse_args($args);

    if( !empty($args['post_types']) ){
        $args['post_types'] = (array) $args['post_types'];
        add_filter( 'terms_clauses','wpse_filter_terms_by_cpt',10,3);

        function wpse_filter_terms_by_cpt( $pieces, $tax, $args){
            global $wpdb;

            // Don't use db count
            $pieces['fields'] .=", COUNT(*) " ;

            //Join extra tables to restrict by post type.
            $pieces['join'] .=" INNER JOIN $wpdb->term_relationships AS r ON r.term_taxonomy_id = tt.term_taxonomy_id 
                                INNER JOIN $wpdb->posts AS p ON p.ID = r.object_id ";

            // Restrict by post type and Group by term_id for COUNTing.
            $post_types_str = implode(',',$args['post_types']);
            $pieces['where'].= $wpdb->prepare(" AND p.post_type IN(%s) GROUP BY t.term_id", $post_types_str);

            remove_filter( current_filter(), __FUNCTION__ );
            return $pieces;
        }
    } // endif post_types set

    return get_terms($taxonomies, $args);           
}

ব্যবহার

$args =array(
    'hide_empty' => 0,
    'post_types' =>array('country','city'),
);

$terms = wpse57444_get_terms('flag',$args);

আসল কাজ প্রায়

উপরের ট্র্যাকের টিকিট থেকে অনুপ্রাণিত, (পরীক্ষিত এবং এটি আমার জন্য কাজ করে)

function wpse57444_filter_terms_by_cpt($taxonomy, $post_types=array() ){
    global $wpdb;

    $post_types=(array) $post_types;
    $key = 'wpse_terms'.md5($taxonomy.serialize($post_types));
    $results = wp_cache_get($key);

    if ( false === $results ) {
       $where =" WHERE 1=1";
       if( !empty($post_types) ){
            $post_types_str = implode(',',$post_types);
            $where.= $wpdb->prepare(" AND p.post_type IN(%s)", $post_types_str);
       }

       $where .= $wpdb->prepare(" AND tt.taxonomy = %s",$taxonomy);

       $query = "
          SELECT t.*, COUNT(*) 
          FROM $wpdb->terms AS t 
          INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id 
          INNER JOIN $wpdb->term_relationships AS r ON r.term_taxonomy_id = tt.term_taxonomy_id 
          INNER JOIN $wpdb->posts AS p ON p.ID = r.object_id 
          $where
          GROUP BY t.term_id";

       $results = $wpdb->get_results( $query );
       wp_cache_set( $key, $results );
    }        

    return $results;
}

ব্যবহার

 $terms = wpse57444_filter_terms_by_cpt('flag',array('country','city'));

অথবা

 $terms = wpse57444_filter_terms_by_cpt('flag','country');

এটি কাজ করে, তবে আমি আমার gs আরগগুলি দিয়ে কী করতে পারি? মানে ... প্যারেন্ট = 0 & অর্ডারবাই = নাম & লুকোচুরি = 0
ব্যবহারকারীর 1443216

: - এই একটি অ্যারের হতে হয়েছে $args = array('parent'=>0,'orderby'=>'name','hide_empty'=>0);। আমি কোয়েরি স্ট্রিংগুলিকে অনুমতি দেওয়ার জন্য এটি সম্পাদনা করব ...
স্টিফেন হ্যারিস

আমি কোথা থেকে এই উদাহরণে আমার $ args লাগাতে পারেন: $terms = wpse57444_filter_terms_by_cpt('flag',array('country','city'));?
ব্যবহারকারী 1443216

আপনি কেবল wpse57444_get_terms()
স্টিফেন হ্যারিস

@ ব্যবহারকারী 1443216 $argsদ্বিতীয় যুক্তি। সেখানে আপনি কেবল রেখেছেনwpse57444_get_terms( 'flag', array( 'country', 'city' ) );
কাইজার

2

@ উপরে স্টিফেন-হ্যারিসের উত্তর কেবল আমার জন্য কাজ করেছে। আমি যদি পৃষ্ঠাটিতে দুবার এটি ব্যবহার করার চেষ্টা করেছি, এটি কার্যকর হয়নি। এছাড়াও, মাইএসকিএল কোয়েরিগুলিকে সমাহিত করার ধারণাটি আমাকে চিন্তিত করে - আমি মনে করি যে সমাধান অর্জনের জন্য মূল পদ্ধতিগুলি ব্যবহার করা, ভবিষ্যতের ডব্লিউপি আপডেটের সাথে দ্বন্দ্ব এড়াতে এর আরও ভাল অনুশীলন। ট্র্যাকের টিকিটের বিষয়ে তিনি যে উল্লেখ করেছেন তার উপর # 7 মন্তব্য করার ভিত্তিতে আমার সমাধান এখানে

function get_terms_by_custom_post_type( $post_type, $taxonomy ){
  $args = array( 'post_type' => $post_type);
  $loop = new WP_Query( $args );
  $postids = array();
  // build an array of post IDs
  while ( $loop->have_posts() ) : $loop->the_post();
    array_push($postids, get_the_ID());
  endwhile;
  // get taxonomy values based on array of IDs
  $regions = wp_get_object_terms( $postids,  $taxonomy );
  return $regions;
}

ব্যবহার:

$terms = get_terms_by_custom_post_type('country','flag');

এটি কেবলমাত্র একটি পোস্ট ধরণের এবং একটি শ্রেণীবিন্যাসের জন্য কাজ করে, কারণ এটি আমার প্রয়োজন, তবে একাধিক মান গ্রহণ করার জন্য এটি সংশোধন করা খুব কঠিন হবে না।

ট্র্যাক থ্রেডে কিছু উল্লেখ ছিল যে এটি ভাল স্কেল নাও হতে পারে তবে আমি বেশ ছোট স্কেলে কাজ করছি এবং গতির সাথে কোনও সমস্যা নেই।


এই সমাধানটি আমার কাছে আরও "দেশীয়" দেখায় - যাইহোক -> আপনাকে "ডাব্লুপি_রেসেট_পোস্টডেটা ()" লুপটির "শেষ অবধি" পরে ডাকা উচিত: ওয়ার্ডপ্রেস.স্ট্যাকেক্সেঞ্জ
সেকশনস / 144343/…

2

দুটি কাস্টম পোস্ট প্রকারের 'দেশ' এবং 'শহর' এবং একটি ভাগ করা শুল্ক 'পতাকা'। আপনি তালিকাটি 'দেশ' পোস্টের মধ্যে সীমাবদ্ধ করতে চান।

এখানে আরও সহজ সমাধান:

$posts_in_post_type = get_posts( array(
    'fields' => 'ids',
    'post_type' => 'country',
    'posts_per_page' => -1,
) );
$terms = wp_get_object_terms( $posts_in_post_type, 'flag', array( 'ids' ) ); ?>

1

[সম্পাদনা] এটি স্টিফেন হ্যারিসের দুর্দান্ত উত্তরের একটি মন্তব্য।

এটির মতো একাধিক পোস্ট ধরণের ব্যবহার করা থাকলে কোনও পদ শোধ করে না $flags = wpse57444_get_terms('flags', array('post_types' => array('country','city')));। এটি কারণ $ wpdb-> স্যানিটাইটিসগুলি প্রস্তুত করে $ post_types_str স্ট্রিংটি p.post_type IN('country,city')হওয়া উচিত p.post_type IN('country','city')। এই টিকিটটি দেখুন: 11102 । এটি পেতে এই বিষয়টির সমাধানটি ব্যবহার করুন: /programming//a/10634225


1

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

তদুপরি, আমার একই পৃষ্ঠায় একাধিকবার সেই ফাংশনটি ব্যবহার করা দরকার এবং আমি wpse_filter_terms_by_cptমোড়ক ফাংশনের বাইরে ফাংশনটি ঘোষিত সমস্যাটি সমাধান করেছি ।

যাইহোক আমার মতামত অনুসারে @ মার্ক প্রিউসের উত্তর আরও ভাল ফিট করে, একই কারণে তিনি বলেছিলেন, যদিও wp_get_object_termsফাংশনটির জন্য অর্গগুলি প্রস্তুত করার জন্য আপনার আরও একটি ক্যোয়ারী (এবং সম্পর্কিত লুপ) তৈরি করা দরকার ।

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