2014-02-18 8 views
0

В шаблоне 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'); 

ответ

1

Вы должны придерживаться использования WP_Query как обычный цикла WordPress, но использовать posts_join, posts_where и posts_orderby фильтры для изменения запроса он генерирует так он запрашивает против метаданные пользователя, как у вас в вашем запросе.

Это позволит WP_Query применять обычные правила разбивки на страницы и другое поведение.

+0

Спасибо за ответ. Смогу ли я просто добавить эти фильтры непосредственно перед вызовом has_post() и т. Д., Или мне нужно найти запрос где-нибудь в файлах? –

+0

Я попытался это сделать - вы можете увидеть код под оригинальным сообщением. –