একটি কাস্টম ট্যাক্সনোমি টার্মের শীর্ষ স্তরের পিতা-মাতা পান


14

আমি কীভাবে একটি নির্দিষ্ট মেয়াদের শীর্ষ স্তরের পিতামাতাকে পেতে পারি?

আমি wp_get_object_termsপোস্টগুলিতে ট্যাক্সনোমির শর্তাদি পেতে ব্যবহার করছি তবে সমস্ত ট্যাগ শর্তাবলীর পরিবর্তে আমি কেবল ট্যাগ শর্তাদি শীর্ষ স্তরের পিতামাতাকেই দেখাতে চাই।

সুতরাং এটি যদি আমার নির্বাচিত পদ হয় তবে আমি কেবল প্রাতঃরাশ, মধ্যাহ্নভোজন এবং রাতের খাবার প্রদর্শন করতে চাই।

x BREAKFAST
   x Cereal
   x Eggs
  LUNCH
     Hamburger
   x Pizza
  DINNER
     Fish
        Bass
      x Salmon
        Trout
     Lasagna

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

উত্তর:


22

এই কোডটির জন্য আইভায়লোকে ধন্যবাদ, যা বেনটারনেটের উত্তরের ভিত্তিতে ছিল।

নীচের প্রথম ফাংশনটি, get_term_top_most_parentএকটি পদ এবং শৈলশক্তি গ্রহণ করে এবং এই পদটির শীর্ষ স্তরের পিতামাতার (বা এই শব্দটি পিতৃহারা না হলে) প্রদান করে; দ্বিতীয় ফাংশন ( get_top_parents) লুপে কাজ করে এবং একটি শ্রেনী দেওয়া হয়, একটি পোস্টের পদগুলির শীর্ষ স্তরের পিতামাতার একটি এইচটিএমএল তালিকা প্রদান করে।

// Determine the top-most parent of a term
function get_term_top_most_parent( $term, $taxonomy ) {
    // Start from the current term
    $parent  = get_term( $term, $taxonomy );
    // Climb up the hierarchy until we reach a term with parent = '0'
    while ( $parent->parent != '0' ) {
        $term_id = $parent->parent;
        $parent  = get_term( $term_id, $taxonomy);
    }
    return $parent;
}

উপরের ফাংশনটি একবার হয়ে গেলে, আপনি ফিরে আসা ফলাফলগুলি লুপ করে wp_get_object_termsপ্রতিটি টার্মের শীর্ষ পিতামাতাকে প্রদর্শন করতে পারেন :

function get_top_parents( $taxonomy ) {
    // get terms for current post
    $terms = wp_get_object_terms( get_the_ID(), $taxonomy );
    $top_parent_terms = array();

    foreach ( $terms as $term ) {
        //get top level parent
        $top_parent = get_term_top_most_parent( $term, $taxonomy );
        //check if you have it in your array to only add it once
        if ( !in_array( $top_parent, $top_parent_terms ) ) {
            $top_parent_terms[] = $top_parent;
        }
    }

    // build output (the HTML is up to you)
    $output = '<ul>';
    foreach ( $top_parent_terms as $term ) {
          //Add every term
          $output .= '<li><a href="'. get_term_link( $term ) . '">' . $term->name . '</a></li>';
    }
    $output .= '</ul>';

    return $output;
}

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

@ রবার্টএন্ড্রুজ যদি আপনার কেবলমাত্র একটি টার্মের বাচ্চাদের প্রয়োজন হয় তবে আপনি ওয়ার্ডপ্রেসের অন্তর্নির্মিত get_term_children( $term, $taxonomy )( ডকুমেন্টেশন ) ব্যবহার করতে পারেন । আপনি একটি প্রদত্ত শব্দটি এর টপ লেভেল পিতা বা মাতা এর সব শিশুদের পেতে চেয়েছিলেন, আপনি এটির মতো তা উপরে ফলাফলের পাস পারে: get_term_children( get_term_top_most_parent( $term, $taxonomy ), $taxonomy )
সুপারটারু

এই ক্ষেত্রে $ টার্মটি কী, অর্থাত্। অবজেক্ট, পদটির নাম, উপ-শ্রেণিবদ্ধ নাম_সংখ্যা? সব ক্ষেত্রে, এই পদ্ধতিটি লোড করার জন্য অত্যন্ত দীর্ঘ। আমি এখন বেশ কয়েক মিনিটের জন্য পৃষ্ঠাটি লোড হওয়ার অপেক্ষায় রয়েছি।
রবার্ট অ্যান্ড্রুজ

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

21

৩.১.০ থেকে, get_ancestors()উপলব্ধ। এটি পূর্বপুরুষের একটি বিন্যাসকে নিম্নক্রম থেকে নিম্ন স্তরের শ্রেণিবিন্যাসে ফিরিয়ে দেয়।


1
এটি আমার মতে সঠিক উত্তর।
গণিত

1
এটি সেরা উত্তর।
চিহ্নিত করুন

8

এখানে একটি সাধারণ ফাংশন যা আপনাকে প্রদত্ত যে কোনও শর্তের মধ্যে সর্বাধিক অভিভাবকীয় শব্দটি পাবেন:

function get_term_top_most_parent( $term_id, $taxonomy ) {
    $parent  = get_term_by( 'id', $term_id, $taxonomy );
    while ( $parent->parent != 0 ){
        $parent  = get_term_by( 'id', $parent->parent, $taxonomy );
    }
    return $parent;
}

আপনার এই ফাংশনটি একবার হয়ে গেলে আপনি ফিরে আসা ফলাফলগুলি লুপ করতে পারবেন wp_get_object_terms:

$terms =  wp_get_object_terms( $post->ID, 'taxonomy' );
$top_parent_terms = array();
foreach ( $terms as $term ) {

    //Get top level parent
    $top_parent = get_term_top_most_parent( $term->ID, 'taxomony' );

    //Check if you have it in your array to only add it once
    if ( !in_array( $top_parent->ID, $top_parent_terms ) ) {
        $top_parent_terms[] = $top_parent;
    }
}

ধন্যবাদ! আমি এখন এটি চেষ্টা করছি। এফওয়াইআই আমি মনে করি আপনি ফাংশনের প্রথম লাইনে একটি ঘনিষ্ঠ পেরেন মিস করছেন।
সুপারট্রু

আমার কি $ শীর্ষ_পত্রে দ্বিতীয় প্যারামিটার হিসাবে $ শ্রেণীবদ্ধ যুক্ত করতে হবে?
সুপারট্রু

আমি $ ট্যাক্সোনমি প্যারামিটারটি যুক্ত করেছি তবে আমি এই কোডটি ব্যবহার করার সময় একটি ত্রুটি পাচ্ছি, এখানে: gist.github.com/1122631
সুপারট্রু

হ্যাঁ আপনি করেন আমি উত্তর আপডেট।
বেন্টারনেট

1
আপনার ফাংশনটি ভাঙ্গা মনে হচ্ছে আপনার ফোরচ লুপগুলি এটিকে ওভারল্যাপ করছে: পেস্টবিন.
com

5
/**
 * Get top level term
 */
function get_top_level_term($term,$taxonomy){
    if($term->parent==0) return $term;
    $parent = get_term( $term->parent,$taxonomy);
    return get_top_level_term( $parent , $taxonomy );
}

1
আপনার কোড সহ একটি ব্যাখ্যা যোগ করুন।
s_ha_dum

4

আমার একই সমস্যা ছিল এবং আমি সহজেই সমাধান করেছি। এটা দেখ:

সংজ্ঞা দিন $taxonomy। এটি আপনি যে তথ্য বিভাগটি পেতে চান তাতে স্লাগ হতে পারে। এটি করার পরে, আপনি কেবল এটি করতে পারেন:

<?php
    $postterms = wp_get_post_terms($post->ID, $taxonomy);   // get post terms
    $parentId = $postterms[0]->parent;                      // get parent term ID
    $parentObj = get_term_by('id', $parentId, $taxonomy);   // get parent object 
?>

এখন আপনি এরকম কিছু পেয়েছেন:

object(stdClass)#98 (11) {
  ["term_id"]=>
  int(3)
  ["name"]=>
  string(8) "Esportes"
  ["slug"]=>
  string(8) "esportes"
  ["term_group"]=>
  int(0)
  ["term_taxonomy_id"]=>
  int(3)
  ["taxonomy"]=>
  string(17) "noticiaseditorias"
  ["description"]=>
  string(0) ""
  ["parent"]=>
  int(0)
  ["count"]=>
  int(4)
  ["object_id"]=>
  int(123)
  ["filter"]=>
  string(3) "raw"
}

এবং আপনি $parentObjস্লাগ, নাম, আইডি, যাই হোক না কেন পেতে ব্যবহার করতে পারেন । যেমন ব্যবহার $parentObj->slugবা উদাহরণ $parentObj->nameহিসাবে।



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