В шаблоне Wordpress у меня есть индексный файл, который показывает некоторые сообщения в блоге. Запрос не существует (но, я думаю, его можно просто перезаписать), но блогпосты показаны через has_posts(), while-loop и т. Д.Wordpress query - foreach/while
Он также использует некоторую разбивку на страницы.
Я хочу, чтобы сообщения в блогах были отсортированы по мета-ключу, принадлежащему автору сообщений. Я нашел решение сделать это с этим
$querystr = "
SELECT wposts.*
FROM $wpdb->posts wposts, $wpdb->usermeta umeta
WHERE wposts.post_author = umeta.user_id
AND umeta.meta_key = 'wp-last-login'
AND wposts.post_type = 'post'
AND wposts.post_status = 'publish'
ORDER BY umeta.meta_value DESC
";
$pageposts = $wpdb->get_results($querystr, OBJECT);
, а затем сделать цикл foreach.
Это нормально работает, но это испортит разбивку на страницы.
Поэтому я хотел бы помочь выяснить, как получить разбиение на страницы с помощью метода foreach или получить способ сортировки фактического кода, как указано выше, но с обычным методом запросов, который используется has_posts() , while-query и т. д. Обзор исходного кода (но без запроса) находится здесь.
<?php if (have_posts()) : ?>
<?php $count = 0; while (have_posts()) : the_post(); $count++; ?>
<!-- Show posts -->
<?php endwhile; ?>
<?php
$next_page = get_next_posts_link(__('Next', 'Destro'));
$prev_pages = get_previous_posts_link(__('Previous', 'Destro'));
if(!empty($next_page) || !empty($prev_pages)) :
?>
<div class="pagination">
<?php if(!function_exists('wp_pagenavi')) : ?>
<div class="al"><?php echo $prev_pages; ?></div>
<div class="ar"><?php echo $next_page; ?></div>
<?php else : wp_pagenavi(); endif; ?>
</div><!-- /pagination -->
<?php endif; ?>
etc...
---- EDIT -----
Я попытался сделать это сейчас, но это не похоже на работу. Он вставляется непосредственно перед have_posts(), и цикл начинается
function joinPostmeta($join) {
global $wp_query, $wpdb;
$join .= "LEFT JOIN $wpdb->usermeta umeta ON $wpdb->posts.post_author = umeta.user_id";
return $join;
}
function wherePostmeta($where) {
global $wp_query, $wpdb;
$where .= "AND umeta.meta_key = 'wp-last-login'";
return $where;
}
function orderbyPostmeta($orderby_statement) {
global $wp_query, $wpdb;
$orderby_statement .= "umeta.meta_value DESC'";
return $orderby_statement;
}
add_filter('posts_join', 'joinPostmeta');
add_filter('posts_where', 'wherePostmeta');
add_filter('posts_orderby', 'orderbyPostmeta');
Спасибо за ответ. Смогу ли я просто добавить эти фильтры непосредственно перед вызовом has_post() и т. Д., Или мне нужно найти запрос где-нибудь в файлах? –
Я попытался это сделать - вы можете увидеть код под оригинальным сообщением. –