افزودن فیلتر نمایش محصولات دارای کامنت در ووکامرس
در این نوشته به شما روش افزودن یک فیلتر جدید در ووکامرس را میدهیم تا محصولات دارای نظر را فقط نمایش دهید.
افزودن فیلتر نمایش محصولات دارای کامنت در ووکامرس
برای اینکار در فایل functions.php قالب فعال فعلی وردپرس خود قطعه کد زیر را اضافه کنید و آنرا ذخیره کنید:
function add_custom_query_var( $vars ) {
$vars[] = 'orderby';
return $vars;
}
add_filter( 'query_vars', 'add_custom_query_var' );
// Add custom sorting option
function custom_woocommerce_catalog_orderby( $sortby ) {
$sortby['has_comments'] = 'محصولات دارای نظر';
return $sortby;
}
add_filter( 'woocommerce_default_catalog_orderby_options', 'custom_woocommerce_catalog_orderby' );
add_filter( 'woocommerce_catalog_orderby', 'custom_woocommerce_catalog_orderby' );
// Modify the product query to sort by comment count and exclude products without comments
function custom_woocommerce_product_query( $q ) {
if ( isset( $_GET['orderby'] ) && 'has_comments' == $_GET['orderby'] ) {
$q->set( 'orderby', 'comment_count' );
$q->set( 'order', 'DESC' );
// Custom join and where clauses to exclude products without comments
add_filter( 'posts_join', 'custom_posts_join' );
add_filter( 'posts_where', 'custom_posts_where' );
}
}
add_action( 'woocommerce_product_query', 'custom_woocommerce_product_query' );
function custom_posts_join( $join ) {
global $wpdb;
if ( is_admin() ) return $join;
$join .= " LEFT JOIN (SELECT comment_post_ID, COUNT(*) as comment_count FROM {$wpdb->comments} WHERE comment_approved = 1 GROUP BY comment_post_ID) wc_comments ON {$wpdb->posts}.ID = wc_comments.comment_post_ID ";
return $join;
}
function custom_posts_where( $where ) {
global $wpdb;
if ( is_admin() ) return $where;
$where .= " AND wc_comments.comment_count > 0 ";
return $where;
}
// Cleanup the join and where filters after the query is run
function remove_custom_posts_join_where( $query ) {
if ( isset( $_GET['orderby'] ) && 'has_comments' == $_GET['orderby'] ) {
remove_filter( 'posts_join', 'custom_posts_join' );
remove_filter( 'posts_where', 'custom_posts_where' );
}
}
add_action( 'woocommerce_after_shop_loop', 'remove_custom_posts_join_where' );
add_action( 'wp_reset_postdata', 'remove_custom_posts_join_where' );
اگر نیاز به آموزشهای بیشتر وردپرس دارید در بخش نظرات همین نوشته برای ما بنویسید.
برای امتیاز به این نوشته کلیک کنید!
[کل: 2 میانگین: 5]



















میشه این فیلتر رو فقط برای یک دسته خاص فعال کرد؟
بله حتماً. برای محدود کردن به یک دسته خاص، میتونید داخل تابع custom_woocommerce_product_query این شرط رو اضافه کنید:
if ( isset($_GET['orderby']) && 'has_comments' == $_GET['orderby'] && is_product_category('نام-دسته') ) {}بهجای ‘نام-دسته’ نام انگلیسی دسته مورد نظرتون رو قرار بدید.
تداخل با افزونه های کش پیش میاد؟
در حالت عادی خیر، چون این کد فقط روی query محصولات اثر میذاره و در سمت سرور اجرا میشه. اما اگر از افزونههای کش صفحه مثل WP Rocket استفاده میکنید، بعد از هر تغییر فیلتر، کش رو پاک کنید تا نتایج جدید نمایش داده بشن.
میشه این فیلتر رو به همراه فیلتر قیمت هم استفاده کرد؟
بله، این فیلتر با فیلترهای پیشفرض ووکامرس مثل قیمت، دسته، یا مرتبسازی دیگه قابل ترکیبه. فقط ترتیب اجرای فیلترها مهمه؛ بهتره این کد در انتهای فایل functions.php قرار بگیره تا با فیلترهای دیگه تداخل نداشته باشه.
این کد روی نسخه جدید ووکامرس اجرا میشه؟
بله، روی نسخههای جدید ووکامرس (۶ و ۷ به بالا) تست شده و مشکلی نداره. فقط دقت کنید بعد از افزودن کد، کش سایت و مرورگر رو پاک کنید تا تغییرات درست نمایش داده بشن.
این روش روی همه قالبها جواب میده؟
بله در بیشتر قالبهایی که از توابع پیشفرض ووکامرس برای نمایش محصولات استفاده میکنن، بدون مشکل کار میکنه. فقط اگر قالب شما از query سفارشی استفاده میکنه (و از هوک woocommerce_product_query استفاده نمیکنه)، ممکنه لازم باشه اون بخش رو هم ویرایش کنید تا فیلتر روی نتایج اعمال بشه.