مرتب کردن get_categories بر اساس آخرین نوشته ها
سلام. اخیر سوال جالبی در Stackoverflow پرسیده شد مبنی بر اینکه چطور می توان موضوعات دریافتی از تابع get_categories را بر اساس آخرین نوشته ها مرتب کنیم. به عنوان مثال اگر نوشته A در موضوع CAT1 و سپس نوشته B در موضوع CAT2 منتشر شد ترتیب نمایش دسته ها CAT2 و CAT1 باشد.
اولین راهی که به ذهن میرسه استفاده از حلقه های وردپرس هست که من چندان از این روش خوشم نمیاد! پس دست به کار شدم و با استفاده از دستورات SQL و یک sort ساده یک تابع برای این کار نوشتم. تابع به صورت زیر می باشد:
function get_sorted_categories( $order_by = 'id', $args = array() ){ global $wpdb; $category = get_categories( $args ); $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; }
در پارامتر اول تابع می توانید مشخص کنید مرتب سازی بر اساس شناسه نوشته (id)، تاریخ ارسال نوشته (date) و یا تاریخ ویرایش نوشته (modified) انجام شود. در پارامتر دوم که اختیاری می باشد نیز می توانید پارامتر های دلخواهتون را به تابع get_categories پاس بدهید. به مثال زیر توجه کنید:
print_r( get_sorted_categories() ); print_r( get_sorted_categories('date') ); print_r( get_sorted_categories('modified') );
One thought on “مرتب کردن get_categories بر اساس آخرین نوشته ها”
ممنون از مطلب کاربردیتون