web-dev-qa-db-fra.com

Comment trier la liste des publications personnalisées pour les afficher sous la forme d'une arborescence de publications sous catégories et de leurs catégories pour enfants

Je suis nouveau ici et mon anglais n'est pas parfait, je suis donc désolé pour cela :) Je suis ici parce que je travaille sur place avec une liste de messages triée par catégorie et que je ne parviens pas à trier mes messages dans les catégories et catégories d'enfants en dessous. Maintenant tout est foiré. Je voudrais trier mes messages personnalisés comme ça:

CATÉGORIE 1

  • ENFANT CATÉGORIE 1

    • Poster
    • Poster
    • Poster
  • CATÉGORIE ENFANT2

    • Poster
    • Poster
    • Poster

CATÉGORIE 2

  • CATÉGORIE ENFANT3
    • Poster
    • Poster
    • Poster

CATÉGORIE 3

  • Poster
  • Poster

  • CATÉGORIE ENFANT4

    • Poster
    • Poster
    • Poster

Est-ce possible avec ce code:

<?php
$querystr = "SELECT terms.* FROM $wpdb->term_taxonomy tax LEFT JOIN $wpdb->terms terms ON       tax.term_id = terms.term_id WHERE tax.taxonomy = 'MY_CUSTOM_TAXONOMY'";

$categories = $wpdb->get_results($querystr, OBJECT);

foreach( $categories as $category ): 
echo '<div class="category-header"><h3>'.$category->name.'</h3>';  
echo '<p class="category-description">'.strip_tags(term_description($category->term_id,'MY_CUSTOM_TAXONOMY')).'</p></div>';  

$posts = get_posts( array( 'MY_CUSTOM_TAXONOMY' => $category->name, 'post_type' => 'MY_CUSTOM_POST' ) );  
foreach($posts as $post) :  
setup_postdata($post);  

 the_title();   

endforeach;

endforeach;
?>

Je serai reconnaissant pour toute aide, merci !!

3
combi

ok, voici ma solution de travail:

<?php

$args=array(
'post_type'                => 'biblioteka',
'child_of'                 => 0,
'parent'                   => '',
'orderby'                  => 'name',
'order'                    => 'ASC',
'hide_empty'               => 1,
'hierarchical'             => 1,
'exclude'                  => '',
'include'                  => '',
'number'                   => '',
'taxonomy'                 => 'kategoria-pozycji',
'pad_counts'               => false
);

$categories=get_categories($args);

foreach ( $categories as $category ) {

if ( $category->parent > 0 ) {
continue;   
}

echo '<h1 style="font-weight:bold">' . $category->name . '</h1>';

$querystr = "SELECT $wpdb->posts.*
          FROM $wpdb->posts, $wpdb->term_relationships, $wpdb->terms
          WHERE term_id = (" . $category->cat_ID . ")
          AND term_taxonomy_id = (" . $category->term_taxonomy_id . ")
          AND ID = object_id
          AND post_type = 'biblioteka'
          AND post_status = 'publish'
          ORDER BY post_date DESC";
$posts = $wpdb->get_results($querystr, OBJECT);

echo '<ul>';
foreach ( $posts as $post ) {
    setup_postdata($post);  

        echo '<li>'; the_title();   echo '</li>';

        }
echo '</ul>';

$categories2 = get_terms('kategoria-pozycji',array('parent' => $category->term_id , 'hide_empty'=> '0' ));

foreach ( $categories2 as $category ) {

echo '<h2>' . $category->name . '</h2>';

$posts = get_posts( array( 'kategoria-pozycji' => $category->name, 'post_type' => 'biblioteka' ) );  

echo '<ul>';
foreach($posts as $post) { 
    setup_postdata($post);  

        echo '<li>'; the_title();   echo '</li>';

        }
echo '</ul>';

}
}

?>
1
combi

Ma meilleure solution! (fonctionne pour toutes les taxonomies, y compris "catégorie")

$your_taxonomy='category';

function my_Categ_tree($TermName='', $termID, $separator='', $parent_shown=true ){
    $args = 'hierarchical=1&taxonomy='.$TermName.'&hide_empty=0&orderby=id&parent=';
            if ($parent_shown) {$term=get_term($termID , $TermName); $output=$separator.$term->name.'('.$term->term_id.')<br/>'; $parent_shown=false;}
    $separator .= '-';  
    $terms = get_terms($TermName, $args . $termID);
    if(count($terms)>0){
        foreach ($terms as $term) {
            //$selected = ($cat->term_id=="22") ? " selected": "";
            //$output .=  '<option value="'.$category->term_id.'" '.$selected .'>'.$separator.$category->cat_name.'</option>';
            $output .=  $separator.$term->name.'('.$term->term_id.')<br/>';
            $output .=  my_Categ_tree($TermName, $term->term_id, $separator, $parent_shown);
        }
    }
    return $output;
}

Ensuite, vous pouvez sortir:

1) arbre de catégorie cible (taxonomie), utilisant un ID spécifique

echo my_Categ_tree($your_taxonomy, 0 );

2) Toutes les catégories/taxonomies

foreach (get_terms($your_taxonomy, array('hide_empty'=>0, 'parent'=>0)) as $each) {
    echo my_Categ_tree($each->taxonomy,$each->term_id);
}
1
T.Todua

Voici la solution que j'ai résolue les problèmes que vous rencontrez

            //Define Some require
            define(TAX_TYPE, 'category'); //you can also replace your custom taxonomy in category
            $terms = get_terms(TAX_TYPE); 
            define(WP_HOME, 'http://yourdomain.com');


        ?>
        <div class="menu-tours-container">
            <ul id="menu-tours" class="menu">
                <?php 
                    foreach( $terms as $tax_term ) : 

                    $permalink = WP_HOME . '/' . TAX_TYPE . '/' . $tax_term->slug;

                    // getting posts from each tour type
                    $args=array(
                        'post_type'     => 'tour',
                        'post_status'   => 'publish',
                        'order_by'      => 'post_title',
                        'order'         => 'ASC',
                        'tour-type'    => $tax_term->slug
                    );
                    $posts = get_posts($args);

                ?>                        
                    <li>
                        <div class="block-title">
                            <h4><?php echo $tax_term->name; ?></h4>
                        </div>
                        <ul class="check">
                            <?php foreach ($posts as $post) : ?>
                            <li><a href="<?php echo get_permalink($post->ID); ?>"><?php echo $post->post_title; ?></a></li>
                            <?php endforeach; ?>
                        </ul>
                    </li>                 
                <?php endforeach; ?>
            </ul> <!--#menu-tours-->

        </div>
0
por

J'ai joué un peu et voici ce que j'ai créé, j'ai testé et cela fonctionne exactement comme votre exemple donné:

<ul>
<?php

// get initial categories
$categories = get_categories();

foreach ( $categories as $category ) {

// we don't want child categories now, and since get_categories does not support 'depth' parameter, we use ->parent check
if ( $category->parent > 0 ) {
    continue;   
}

$i = 0;
echo '<li>' . $category->cat_name . '</li>';

$posts = get_posts(
    array(
        'category' => $category->term_id
    )
);

foreach ( $posts as $post ) {

    // let's make sure that the post is not also in any of child categories, if it is, skip it ( we don't want to display it twice )
    $child_categories = get_term_children( $category->term_id, 'category' );

    if ( $child_categories && in_category( $child_categories, $post->ID ) ) {
        continue;
    }

    echo 0 === $i ? '<ul>' : '';
    echo '<li>' . $post->post_title . '</li>';
    $i++;

}

// now, after we listed all the posts, we query for child categories
$categories2 = get_categories(
    array(
        'parent' => $category->term_id
    )
);

foreach ( $categories2 as $category ) {

    $j = 0;
    echo '<li>' . $category->cat_name . '</li>';
    $posts2 = get_posts(
        array(
            'category' => $category->term_id
        )
    );

    foreach ( $posts2 as $post ) {

        echo 0 === $j ? '<ul>' : '';
        echo '<li>' . $post->post_title . '</li>';
        $j++;
    }

    echo null === $posts2 ? '' : '</ul>';

}

echo null === $posts ? '' : '</ul>';

}

?>
</ul>
0
OriginalEXE