कस्टम पोस्ट प्रकार में सभी पोस्ट प्रदर्शित करें, कस्टम टैक्सोनॉमी द्वारा समूहीकृत


18

मैं एक सदस्य पृष्ठ पर काम कर रहा हूं जहां मैं कस्टम टैक्सोनॉमी के साथ कस्टम पोस्ट प्रकार का उपयोग करता हूं। मेरे कस्टम पोस्ट प्रकार को कहा जाता है memberऔर मेरे कस्टम टैक्सोनॉमी को कहा जाता है member_groups

मैं सभी सदस्यों को सूचीबद्ध करना चाहता हूं, लेकिन उन्हें एक साथ उनके संबंधित समूहों में समूहित करना चाहता हूं।

तो स्पष्ट होने के लिए, मैंने 35 सदस्यों को 9 समूहों में विभाजित किया है - इसलिए एक ही क्वेरी को नौ बार करने के बजाय मैं इसे एक बार करना चाहता हूं, लेकिन उन्हें एक साथ समूहित करता हूं, ताकि सदस्य 1, सदस्य 4 और सदस्य 11 एक समूह में एक साथ समूहीकृत हो। जिसे "मार्केटिंग" कहा जाता है।

मैं WP_Queryपोस्ट प्रकार के सदस्य के तहत सभी पदों को पुनः प्राप्त करने के लिए उपयोग कर रहा हूं । मैंने अलग-अलग प्रयास किए लेकिन कोई सफल परिणाम नहीं मिला।

मैं उसे कैसे प्राप्त कर सकता हूं?

जवाबों:


29

इसलिए, आप कई प्रश्नों को स्वचालित करने पर विचार कर सकते हैं।

सबसे पहले, अपने कस्टम वर्गीकरण में शर्तों की सूची प्राप्त करें, का उपयोग करते हुए get_terms():

<?php
$member_group_terms = get_terms( 'member_group' );
?>

फिर, हर एक के माध्यम से लूप करें, हर बार एक नई क्वेरी चलाएं:

<?php
foreach ( $member_group_terms as $member_group_term ) {
    $member_group_query = new WP_Query( array(
        'post_type' => 'member',
        'tax_query' => array(
            array(
                'taxonomy' => 'member_group',
                'field' => 'slug',
                'terms' => array( $member_group_term->slug ),
                'operator' => 'IN'
            )
        )
    ) );
    ?>
    <h2><?php echo $member_group_term->name; ?></h2>
    <ul>
    <?php
    if ( $member_group_query->have_posts() ) : while ( $member_group_query->have_posts() ) : $member_group_query->the_post(); ?>
        <li><?php echo the_title(); ?></li>
    <?php endwhile; endif; ?>
    </ul>
    <?php
    // Reset things, for good measure
    $member_group_query = null;
    wp_reset_postdata();
}
?>

मैं इस दृष्टिकोण के साथ कुछ भी विशेष रूप से गलत नहीं देख सकता, हालांकि इसमें पैमाने पर सीमित क्षमता हो सकती है (यानी यदि आपके पास सैकड़ों या हजारों सदस्य हैं, या सदस्य_ग्रुप शब्द हैं, तो आप प्रदर्शन के मुद्दे देख सकते हैं)।


हाँ, यह पूरी तरह से एक शब्द है। मेरे पास एक मुद्दा है। मैं इस तरह कटोम फ़ील्ड प्रदर्शित करना चाहता हूं <? Php get_post_meta ($ मेंबर_ग्रुप_टरम-> ID, 'job_title', true)?>; लेकिन यह काम नहीं करता है। मैंने $ पोस्ट के साथ भी कोशिश की है। > आईडी लेकिन कोई काम नहीं किया, क्या आप @ बेनेट कृपया मदद कर सकते हैं?
अनाहत DEV

6

मुझे एक कस्टम क्वेरी का उपयोग करके और फिर इसे नाम नाम के साथ समूहीकृत करके एक हल मिला:

SELECT * 
FROM wp_term_taxonomy AS cat_term_taxonomy
INNER JOIN wp_terms AS cat_terms ON cat_term_taxonomy.term_id = cat_terms.term_id
INNER JOIN wp_term_relationships AS cat_term_relationships ON cat_term_taxonomy.term_taxonomy_id = cat_term_relationships.term_taxonomy_id
INNER JOIN wp_posts AS cat_posts ON cat_term_relationships.object_id = cat_posts.ID
INNER JOIN wp_postmeta AS meta ON cat_posts.ID = meta.post_id
WHERE cat_posts.post_status =  'publish'
AND meta.meta_key =  'active'
AND meta.meta_value =  'active'
AND cat_posts.post_type =  'member'
AND cat_term_taxonomy.taxonomy =  'member_groups'

फिर बस एक नियमित रूप से फोरच क्वेरी का उपयोग करके मैं केवल अपनी इच्छित जानकारी निकाल सकता हूं।

लेकिन मुझे अभी भी एक और तरीके से दिलचस्पी है अगर वहाँ है, शायद वर्डप्रेस के अपने कार्यों का उपयोग करके।


मैंने अभी एक वैकल्पिक विधि जोड़ी है। मैं कुछ भी है कि कच्चे SQL प्रश्नों की आवश्यकता से दूर भागते हैं।
चिप बैनेट

2
मुझे यह सही उत्तर के रूप में चिह्नित करते हुए खुशी हो रही है, भले ही क्वेरी वर्डप्रेस में काम करना बंद कर दे, यदि स्कीमा किसी बिंदु पर बदलता है ... उन सभी को एक ही क्वेरी में एकत्रित करने की अवधारणा सही उत्तर है। इस वसीयत के अनुसार php अभ्यस्त पैमाने में वर्गीकरण को समूहित करने के लिए परिवर्तन।
wowo_999

4

और भी सरल:

$terms = get_terms('tax_name');
$posts = array();
foreach ( $terms as $term ) {
    $posts[$term->name] = get_posts(array( 'posts_per_page' => -1, 'post_type' => 'post_type', 'tax_name' => $term->name ));
}

परिणामी $ पदों के सरणी के भीतर, प्रत्येक कर अवधि एक नेस्टेड सरणी की कुंजी है जिसमें इसके पद शामिल हैं।


4

मुझे इसकी सटीक आवश्यकता थी, और चिप के समाधान ने काम किया, एक चीज को छोड़कर: 'field' => 'slug'आवश्यक है।

    foreach ( $service_categories as $category ) {
        $services = new WP_Query( 
            array(
                'post_type'     => 'service',
                'tax_query'     => array(
                    array(
                        'taxonomy'  => 'service_category',
                        'terms'     => array( $category->slug ),
                        'operator'  => 'IN',
                        'get'       => 'all',
                        'field'     => 'slug'
                    )
                )
            ) 
        ); ?>
        <h2><?php echo $category->slug; ?></h2>
        <?php if ( $services->have_posts() ) {  // loop stuff goes here ?>

मुझे फ्लैट होने के लिए परिणामी प्रदर्शन की भी आवश्यकता थी, इसलिए 'get' => 'all'यहां सेट किया गया है।

उम्मीद है कि यह किसी और की मदद करता है।


3
$query = new WP_Query( 
   array ( 
      'post_type' => 'member', 
      'orderby'   => 'meta_value', 
      'meta_key'  => 'member_group' 
   ) 
);

तब जब आप इस क्वेरी के माध्यम से लूप करते हैं तो आप इन पंक्तियों के साथ (php pseudocode में) उपयोग कर सकते हैं

$groupName = "";
$counter = 0;
if havePosts: while havePosts: thePost

if( $groupName != post->meta_value )
{
if ($counter > 0)
{
</ul>
}
<h1>A group name</h1>
<ul>
<li>member name</li>
}
else
{
<li>member name</li>
}

endwhile;endif

</ul>

मुझे आशा है कि वह मदद करेंगे। मुझे लगता है कि आप इसे जरूरत से ज्यादा जटिल बना रहे थे।

अधिक जानकारी: http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parametors


3

मुझे यह एक प्रोजेक्ट पर सालों पहले करना था। Djb के समान उत्तर, बस थोड़ा अधिक विवरण के साथ। यह आपके सभी वर्गीकरण नामों को h3 के रूप में आउटपुट करेगा, जिसमें प्रत्येक पोस्ट शीर्षक की बुलेटेड सूची उनके विवरण पृष्ठ से जुड़ी होगी।

<?php // Output all Taxonomies names with their respective items
$terms = get_terms('member_groups');
foreach( $terms as $term ):
?>                          
    <h3><?php echo $term->name; // Print the term name ?></h3>                          
    <ul>
      <?php                         
          $posts = get_posts(array(
            'post_type' => 'member',
            'taxonomy' => $term->taxonomy,
            'term' => $term->slug,                                  
            'nopaging' => true, // to show all posts in this taxonomy, could also use 'numberposts' => -1 instead
          ));
          foreach($posts as $post): // begin cycle through posts of this taxonmy
            setup_postdata($post); //set up post data for use in the loop (enables the_title(), etc without specifying a post ID)
      ?>        
          <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>    
        <?php endforeach; ?>
    </ul>                                                   
<?php endforeach; ?>

1

ठीक है, यह एक पुराना धागा है, लेकिन अगर कोई मेरे द्वारा पारित किया जाता है, तो यह मदद कर सकता है। यह विचार मुख्य प्रश्न को संशोधित करने के लिए है ताकि हमें टेम्प्लेट जाने और नए प्रश्न और लूप उत्पन्न करने की आवश्यकता न हो ...

पुनश्च: अभी तक बड़े dbs में परीक्षण किया जाना है। यह मेरे मामले में संतोषजनक था।

function grouped_by_taxonomy_main_query( $query ) {

    if ( $query->is_home() && $query->is_main_query() ) { // Run only on the homepage

        $post_ids = array();

        $terms = get_terms('my_custom_taxonomy');

        foreach ( $terms as $term ) {
            $post_ids = array_merge( $post_ids, get_posts( array( 
                'posts_per_page' => 4, // as you wish...
                'post_type' => 'my_custom_post_type', // If needed... Default is posts
                'fields' => 'ids', // we only want the ids to use later in 'post__in'
                'tax_query' => array( array( 'taxonomy' => $term->taxonomy, 'field' => 'term_id', 'terms' => $term->term_id, )))) // getting posts in the current term
            );
        }

        $query->query_vars['post_type'] = 'my_custom_post_type'; // Again, if needed... Default is posts
        $query->query_vars['posts_per_page'] = 16; // If needed...
        $query->query_vars['post__in'] = $post_ids; // Filtering with the post ids we've obtained above
        $query->query_vars['orderby'] = 'post__in'; // Here we keep the order we generated in the terms loop
        $query->query_vars['ignore_sticky_posts'] = 1; // If you dont want your sticky posts to change the order

    }
}

// Hook my above function to the pre_get_posts action
add_action( 'pre_get_posts', 'grouped_by_taxonomy_main_query' );
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.