llgruff
@llgruff
Scala

Как вывести в админку WordPress сортируемую колонку для пользовательского поля, считающего количество просмотров записей?

Добрый день.
Реализован счётчик просмотров статей на WordPress (источник)
/* вывод кол-ва просмотров */
function getPostViews($postID){
    $count_key = 'post_views_count';
    $count = get_post_meta($postID, $count_key, true);
    if($count==''){
        delete_post_meta($postID, $count_key);
        add_post_meta($postID, $count_key, '0');
        return "0";    }
    return $count.'';}

/* регистрируем просмотр */
function setPostViews($postID) {
    $count_key = 'post_views_count';
    $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);    }}

/* вывод кол-ва просмотров в админку */
add_filter('manage_pages_columns', 'posts_column_views');
add_action('manage_pages_custom_column', 'posts_custom_column_views',10,2);
add_filter('manage_posts_columns', 'posts_column_views');
add_action('manage_posts_custom_column', 'posts_custom_column_views',10,2);
function posts_column_views($defaults){
    $defaults['post_views'] = __('Показы');
    return $defaults;}
function posts_custom_column_views($column_name, $id){
    if($column_name === 'post_views'){
        echo getPostViews(get_the_ID());    }}

Всё работает.

/* добавляем возможность сортировать колонку */ Источник
add_filter('manage_edit-post_sortable_columns', 'add_views_sortable_column');
add_filter('manage_edit-page_sortable_columns', 'add_views_sortable_column');
add_filter('manage_edit-slides_sortable_columns', 'add_views_sortable_column');
add_filter('manage_edit-hp_highlights_sortable_columns', 'add_views_sortable_column');
add_filter('manage_edit-portfolio_sortable_columns', 'add_views_sortable_column');
add_filter('manage_edit-staff_sortable_columns', 'add_views_sortable_column');
add_filter('manage_edit-services_sortable_columns', 'add_views_sortable_column');
add_filter('manage_edit-testimonials_sortable_columns', 'add_views_sortable_column');
add_filter('manage_edit-faqs_sortable_columns', 'add_views_sortable_column');
function add_views_sortable_column($sortable_columns){
  $sortable_columns['post_views'] = 'views_views';
  return $sortable_columns;}

Появляется возможность сортировать по колонке "Показы", при нажатии строка имеет вид:
/wp-admin/edit.php?orderby=views_views&order=desc
Но по сути сортировка происходит не по полю "Показы", а по полю "Дата".

/* изменяем запрос при сортировке колонки, показываем WordPress, что нужна сортировка по произвольным полям значения которых являются числами */ (Способ 1)
add_filter('pre_get_posts', 'add_column_views_request');
function add_column_views_request( $object ){
	if( $object->get('orderby') != 'views_views' )
		return;
	$object->set('meta_key', 'post_views');
	$object->set('orderby', 'meta_value_num');}

или (Способ 2)
add_action( 'pre_get_posts', 'add_column_views_request', 1 );
function add_column_views_request( $query ) {
  if ( $query->is_main_query() && ( $orderby = $query->get( 'orderby' ) ) ) {
    switch( $orderby ) {
        case 'views_views':
            $query->set( 'meta_key', 'post_views' );
            $query->set( 'orderby', 'meta_value' );
        break;}}}

или (Способ 3)
add_filter('request', 'add_column_views_request');
function add_column_views_request( $vars ) {
    if ( 'views_views' == $vars['orderby'] ){
		$vars['meta_key'] = 'post_views';
		$vars['orderby'] = 'meta_value_num';}
    return $vars;}

Сортировка просто не даёт результатов: "Записей не найдено."
Подскажите как исправить код, пожалуйста.

В чем может быть проблема?
Благодарю за ответ.
  • Вопрос задан
  • 1228 просмотров
Решения вопроса 1
wppanda5
@wppanda5 Куратор тега WordPress
WordPress Mедведь
вы сохраняете в поле 'post_views_count' а сортируете по 'post_views'

#(Способ 1)
 $object->set('meta_key', 'post_views_count');
#(Способ 2)
 $query->set( 'meta_key', 'post_views_count' );
#(Способ 3)
 $vars['meta_key'] = 'post_views_count';
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы