Я делаю рисунок сайта с помощью WordPress и позволяю моим пользователям рисовать и размещать свои рисунки в качестве закрепленных сообщений
Теперь я хочу сделать тему, которую я использую, чтобы изменить порядок отображаемых сообщений, которые будут отображаться по количеству просмотров или комментариев, а не по дате
Где я могу найти код, отвечающий за порядок размещения сообщений в теме WordPress.
Если вы хотите
pre_get_posts
порядок отображения, вы можете использовать действиеpre_get_posts
.
function wh_post_display_order_comment($query) { if ($query->is_home() && $query->is_main_query()) { $query->set('orderby', 'comment_count'); $query->set('order', 'DESC'); } } add_action('pre_get_posts', 'wh_post_display_order_comment');
По умолчанию WordPress не имеет возможности открывать короткие сообщения, поэтому вам нужно использовать небольшой трюк
function whpp_track_post_views($post_id) { if (!is_single()) return; if (empty($post_id)) { global $post; $post_id = $post->ID; } whpp_set_post_views($post_id); } add_action('wp_head', 'whpp_track_post_views'); function whpp_set_post_views($postID) { $count_key = 'whpp_track_post_views'; $count = get_post_meta($postID, $count_key, true); if ($count == '') { $count = 0; delete_post_meta($postID, $count_key); add_post_meta($postID, $count_key, '0'); } else { $count++; update_post_meta($postID, $count_key, $count); } } //To keep the count accurate, lets get rid of prefetching remove_action('wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0);
Теперь, когда мы установили нашу логику для просмотра, поэтому мы будем ее замыкать
function wh_post_display_order_view($query) { if ($query->is_home() && $query->is_main_query()) { $query->set('meta_key', 'whpp_track_post_views'); $query->set('orderby', 'meta_value_num'); $query->set('order', 'DESC'); } } add_action('pre_get_posts', 'wh_post_display_order_view');
Если вы хотите orderby
и счет, то снова мы должны применить небольшой трюк, так как в WordPress нет опции по умолчанию. Сначала мы посчитаем комментарий, и мы добавим небольшой вес и добавим общее количество просмотров и сохраним это другое мета-поле, а затем мы отсортируем сообщение на этом ключе.
function whpp_track_post_views($post_id) { if (!is_single()) return; if (empty($post_id)) { global $post; $post_id = $post->ID; } whpp_set_post_views($post_id); } add_action('wp_head', 'whpp_track_post_views'); function whpp_set_post_views($postID) { $count_key = 'whpp_track_post_views'; $count = get_post_meta($postID, $count_key, true); //retriving total comments $comments_count = wp_count_comments($postID); $total_comment = $comments_count->total_comments; $comment_point = 2; //change the number with your desired weightage $comment_score = $total_comment * $comment_point; if ($count == '') { $count = 0; delete_post_meta($postID, $count_key); add_post_meta($postID, $count_key, '0'); } else { $count++; update_post_meta($postID, $count_key, $count); } update_post_meta($postID, 'whpp_view_comment_score', ($count + $comment_score)); } //To keep the count accurate, lets get rid of prefetching remove_action('wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0); function wh_post_display_order_view($query) { if ($query->is_home() && $query->is_main_query()) { $query->set('meta_key', 'whpp_view_comment_score'); $query->set('orderby', 'meta_value_num'); $query->set('order', 'DESC'); } } add_action('pre_get_posts', 'wh_post_display_order_view');
Обратите внимание: добавление дополнительного веса для комментариев не является обязательным, но если читатель будет таким же, как и пост, то только они дадут комментарий.
Код идет в файле function.php вашей активной дочерней темы (или темы). Или также в любых плагинах php-файлов.
Код проверен и работает.
Надеюсь это поможет!