Par exemple, si la catégorie A a le poste 1 créé hier et que la catégorie B a le poste 2 créé aujourd'hui. Donc, la catégorie sera listée dans l'ordre Catégorie B Catégorie A
Est-ce que quelqu'un a déjà implémenté cela auparavant?
Ce code répertorie toutes les catégories parentes sur la base des publications récentes dans cette catégorie.
function ravs_cat_list(){
/* all parent categories*/
$args = array(
'parent' => 0
);
$cats = get_categories( $args );
/* get recent post from each category */
foreach( $cats as $cat ):
$args = array(
'numberposts' => 1,
'category' => $cat->term_id
);
$recent_posts = wp_get_recent_posts( $args );
/* category list */
$cat_list[]=array(
'id' => $cat->term_id,
'name' => $cat->name,
'post_date' => $recent_posts[0]['post_date']
);
endforeach;
/* sort $cat_list on basis of resent publish post */
function sortFunction( $a, $b ){
return strtotime($a["post_date"]) - strtotime($b["post_date"]) > 1 ? -1 : 1;
}
usort($cat_list, "sortFunction");
/* print list of sorted categories */
echo'<ul class="cat-list">';
foreach ($cat_list as $cat):
?>
<li><?php print_r($cat['name']); ?></li>
<?php
endforeach;
echo '</ul>';
}
Essayez le:
function get_sorted_categories( $order_by = 'id' ){
global $wpdb;
$category = get_categories();
$order = [
'id' => 'post.ID',
'date' => 'post.post_date',
'modified' => 'post.post_modified',
];
$order_by = $order[ $order_by ];
$q = $wpdb->get_results("SELECT tax.term_id FROM `{$wpdb->prefix}term_taxonomy` tax
INNER JOIN `{$wpdb->prefix}term_relationships` rel ON rel.term_taxonomy_id = tax.term_id
INNER JOIN `{$wpdb->prefix}posts` post ON rel.object_id = post.ID WHERE tax.taxonomy = 'category' AND post.post_type = 'post' AND post.post_status = 'publish' ORDER BY {$order_by} DESC");
$sort = array_flip( array_unique( wp_list_pluck( $q, 'term_id' ) ) );
usort( $category, function( $a, $b ) use ( $sort, $category ) {
if( isset( $sort[ $a->term_id ], $sort[ $b->term_id ] ) && $sort[ $a->term_id ] != $sort[ $b->term_id ] )
$res = ($sort[ $a->term_id ] > $sort[ $b->term_id ]) ? 1 : -1;
else if( !isset( $sort[ $a->term_id ] ) && isset( $sort[ $b->term_id ] ) )
$res = 1;
else if( isset( $sort[ $a->term_id ] ) && !isset( $sort[ $b->term_id ] ) )
$res = -1;
else
$res = 0;
return $res;
} );
return $category;
}
print_r( get_sorted_categories() );
print_r( get_sorted_categories('date') );
print_r( get_sorted_categories('modified') );
Obtenir les catégories classées par (numéro de poste | date de publication | date de modification). Sans aucune boucle et rapide!