it-swarm.com.de

Taxonomie-Menü mit Beitragsanzahl und mehreren Eltern

Ich benutze WordPress 3.1.3 und versuche, ein "Produkt" -Menü mit der Anzahl der Posts in jeder Kategorie zu erstellen. So was:

  • Neuwagen (4)
    • BMW (2)
    • Ford (1)
    • Nissan (1)
  • Gebrauchtwagen (10)
    • BMW (3)
    • Ford (1)
    • Nissan (6)

Dazu habe ich einen benutzerdefinierten Beitragstyp Cars und Taxonomien Type und Brand erstellt. Ich bin mir nicht sicher, ob dies der beste Weg ist, aber hier ist mein Code:

<?php $auto_types = get_terms('type', 'hide_empty=1'); ?>
<ul>
<?php foreach( $auto_types as $auto_type ) : ?>
  <li>
    <a href="<?php echo get_term_link( $auto_type->slug, 'type' ); ?>">
      <?php echo $auto_type->name; ?> (<?php echo $auto_type->count; ?>)
    </a>
                <?php
                $terms = get_terms('brand');
                $count = count($terms);
                if($count > 0) :
                    ?>
                     <ul>
                        <?php foreach ($terms as $term) : ?> 

                        <li>
                            <a href="/?type=<?php echo $auto_type->slug ?>&brand=<?php echo $term->slug ?>">
                                    - - <?php echo $term->name; ?> (<?php echo $term->count; ?>)
                            </a>
                        </li>
                        <?php endforeach ?>
                    </ul>
                    <?php endif ?>

    </li>           
<?php endforeach ?>
</ul>

Meine Fragen sind also:

  • ist dies ein guter Weg, um es zu tun?
  • wie kann ich die Anzahl der Posts filtern?

Bearbeiten - Ich habe es geschafft, mein zweites Problem zu lösen, aber ich bin mir immer noch nicht sicher, ob es ein guter Weg ist, es zu tun. Hier ist neuer Code:

<?php $auto_types = get_terms('type', 'hide_empty=1'); ?>
    <ul>
    <?php foreach( $auto_types as $auto_type ) : ?>
        <li>
        <a href="<?php echo get_term_link( $auto_type->slug, 'type' ); ?>"> 
            <?php echo $auto_type->name; ?>
        </a>
        <?php $auto_brands = get_terms('brand', 'parent=0' ); ?>
            <ul>
                <?php foreach ($auto_brands as $auto_brand) : ?>
                    <?php $brand_filter['tax_query'] = array(
                            'relation' => 'AND',
                            array(
                                'taxonomy' => 'type',
                                'terms' => array($auto_type->slug),
                                'field' => 'slug',
                            ),
                            array(
                                'taxonomy' => 'brand',
                                'terms' => array($auto_brand->slug),
                                'field' => 'slug',
                            ),
                        );
                    $tax_query = new WP_Query($brand_filter);
                        $count = 0;
                    if ( $tax_query->have_posts() ) : while ( $tax_query->have_posts() ) : $tax_query->the_post();
                        $count++;
                    endwhile; endif; wp_reset_postdata();
                        if ( $count > 0 ) : ?>
                            <li>
                                <a href="/?type=<?php echo $auto_type->slug ?>&brand=<?php echo $auto_brand->slug ?>">
                                    - - <?php echo $auto_brand->name; ?> (<?php echo $count; ?>)
                                </a>
                            </li>
                <?php endif; endforeach ?>
            </ul>                 
        </li>           
    <?php endforeach ?>
    </ul>

Edit 2 - query_posts()-Methode in wp_query() geändert (dank VicePrez), aber ist es effizient, mit query nur die korrekte Anzahl der Posts zu ermitteln, oder gibt es einen besseren Weg, dieses Menü zu erstellen?

5
Kovas

Ich habe Ihren Code ein wenig angepasst, um die Klasse wp_query() anstelle von query posts() zu integrieren, die nur zum Ändern der Hauptschleife gedacht ist. Sie sollten always wählen, um wp_query() zu verwenden, wenn Sie versuchen, sekundäre Schleifen zu erstellen.

Da wir wp_query() verwenden, müssen wir auch wp_reset_postdata() anstelle von wp_reset_query verwenden. Ich bin mir nicht sicher, ob dies Ihr Problem beheben wird, aber passen Sie Ihren Code daran an, und wir werden den Rest Ihrer Probleme Schritt für Schritt angehen.

<?php $auto_types = get_terms('type', 'hide_empty=1'); ?>
<ul>
<?php foreach( $auto_types as $auto_type ) : ?>
    <li>
    <a href="<?php echo get_term_link( $auto_type->slug, 'type' ); ?>"> 
        <?php echo $auto_type->name; ?>
    </a>
    <?php $auto_brands = get_terms('brand', 'parent=0' ); ?>
        <ul>
            <?php foreach ($auto_brands as $auto_brand) : ?>
                <?php $brand_filter['tax_query'] = array(
                        'relation' => 'AND',
                        array(
                            'taxonomy' => 'type',
                            'terms' => array($auto_type->slug),
                            'field' => 'slug',
                        ),
                        array(
                            'taxonomy' => 'brand',
                            'terms' => array($auto_brand->slug),
                            'field' => 'slug',
                        ),
                    );
                    $tax_query = new WP_Query($brand_filter);
                    if ( $tax_query->have_posts() ) :

                        $count = 1;
                        while ( $tax_query->have_posts() ) : 
                        $tax_query->the_post();

                        if ( $count >= 1 ) { ?>
                           <li>
                               <a href="/?type=<?php echo $auto_type->slug ?>&brand=<?php echo $auto_brand->slug ?>">
                                   - - <?php echo $auto_brand->name; ?> (<?php echo $count; ?>)
                               </a>
                           </li>
                        <? }

                        $count++;

                        endwhile; 
                        wp_reset_postdata();

                    endif; 
                endforeach 
            ?>
        </ul>                 
    </li>           
<?php endforeach ?>
</ul>

UPDATE:Ich habe den Parameter posts_per_page hinzugefügt und auf -1 gesetzt, um alle Beiträge anzuzeigen. Ich habe es auf meiner Seite getestet. Es sollte Ihnen die gewünschten Ergebnisse liefern.

<?php $auto_types = get_terms('type', 'hide_empty=1'); ?>
<ul>
<?php foreach( $auto_types as $auto_type ) : ?>
    <li>
    <a href="<?php echo get_term_link( $auto_type->slug, 'type' ); ?>"> 
        <?php echo $auto_type->name; ?>
    </a>
    <?php $auto_brands = get_terms('brand', 'parent=0' ); ?>
        <ul>
            <?php foreach ($auto_brands as $auto_brand) : ?>
                <?php $brand_filter = array(
                    'posts_per_page' => '-1',
                    'tax_query' => array(
                        'relation' => 'AND',
                        array(
                            'taxonomy' => 'type',
                            'field' => 'slug',
                            'terms' => array($auto_type->slug),
                        ),
                        array(
                            'taxonomy' => 'brand',
                            'field' => 'slug',
                            'terms' => array($auto_brand->slug),
                        )
                    )
                );
                $tax_query = new WP_Query($brand_filter);
                    $count = 0;
                if ( $tax_query->have_posts() ) : while ( $tax_query->have_posts() ) : $tax_query->the_post();
                    $count++;
                endwhile; endif; wp_reset_postdata();
                    if ( $count > 0 ) : ?>
                        <li>
                            <a href="/?type=<?php echo $auto_type->slug ?>&brand=<?php echo $auto_brand->slug ?>">
                                - - <?php echo $auto_brand->name; ?> (<?php echo $count; ?>)
                            </a>
                        </li>
            <?php endif; endforeach ?>
        </ul>                 
    </li>           
<?php endforeach ?>
</ul>
1
VicePrez