Как написать цикл постов в вп сортированный по мета кей с пегинацией?

Написал плагин лайк баттонов для постов. Просто при клике на кнопку изменяется значения мета кей и изменяется значения в базе данных в отдельной таблице. Теперь вопрос как написать цикл вывода постов сортированный по лайкам. То есть самый залайканые с верху?

Те идею которые у меня в голове.
1 Перебрать циклов все посты и создать для них мета кей равным -9999 по умолчанию а потом написать цикл вывода постов с правилом если лайк равно -9999 то вообще не показывать это число. Как бы симулирование. Но я не нашел в вп как можно зарегистрировать банально для сразу всех постов мета кей, только SQL инсерты.
2 Написал я два цикла. Первый выводит все посты с мета кеем (у которых есть данный мет кей) и сортированные по мета кей. Вторым циклов вывести все посты у которых нету данного мета кея. Получиться то что нужно кроме того, что данные два цикла никак нельзя разделить на страницы с навигацией в низу.
$args = array(
    'post_status' => 'publish',
    'post_type' => 'post',
    'meta_key' => 'vote-count',
    'orderby' => 'meta_value_num'
);
show_posts($args);
$args = array(
	'post_status' => 'publish',
    'post_type' => 'post',
    'posts_per_page' => -1,
    'meta_query' => array(
	    array(
	        'key' => 'vote-count',
	        'compare' => 'NOT EXISTS'
	    )
    )
);
show_posts($args);
function show_posts($args) {
	$query = new WP_Query($args);
	if ( $query->have_posts() ) {
		echo '<ul >';
		while ( $query->have_posts() ) {
			$query->the_post();
			echo '<li style="margin-top: 10px;">' .'<span style="color:red;">' . get_post_meta( get_the_ID(),'vote-count',true) . ' </span> '. get_the_title(). '</li>';
		}
		echo '</ul>';
	}
	wp_reset_query();
}

// 'relation' => 'OR',  - Для него не работает сортировка.
  • Вопрос задан
  • 2298 просмотров
Пригласить эксперта
Ответы на вопрос 2
JekFdrv
@JekFdrv Автор вопроса
webdeveloper
И так обновление. Самый официальный ответ, который используют другие плагины таков:
add_action( 'pre_get_posts', 'wpse_71899_start_filter' );

function wpse_71899_start_filter() {
	if ( ! is_front_page() )
        return; // stop here.
	add_filter('posts_orderby', 'edit_posts_orderby');
	add_filter('posts_join_paged','edit_posts_join_paged');
}
function edit_posts_join_paged($join_paged_statement) {
	global $wpdb;
	$join_paged_statement = "LEFT JOIN ".$wpdb->prefix."post_vote_counts ON ".$wpdb->prefix."post_vote_counts.post_id = $wpdb->posts.ID";
	return $join_paged_statement;	
}

function edit_posts_orderby($orderby_statement) {
	global $wpdb;
	$orderby_statement = "(".$wpdb->prefix."post_vote_counts.upvote_count) DESC";
	return $orderby_statement;
}


НО, данный код работает только для домашней страницы, и это нельзя никак поменять, если мы убираем правило у нас исчезают посты в категориях, то есть вообще категории ничего не будут отображать циклом. Я даже не знаю как это можно использовать. У ВП тут дыра. По идее нужно указывать в цикле какую-то переменную которая будет переключать и использовать данный вид вывода постов.
Ответ написан
Комментировать
используйте экшн pre_get_posts. Документация в кодексе.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы