Как запросить последние 5 записей и отсортировать их по заголовку?

23 июн. 2011 г., 00:16:24
Просмотры: 1.12K
Голосов: 0

Мне нужно создать меню со списком последних "n" записей, где число "n" будет определяться пользователем и храниться в настройках.

n = 5; // Получить последние 5 записей из базы данных.

Скрипт, который я сейчас использую (ниже), получает все записи из базы данных, а затем отображает только последние 5 из этой коллекции.

Это работает нормально, пока я не решаю отсортировать список по заголовку. Когда я это делаю, вместо сортировки последних 5 записей по заголовку, происходит сортировка всей коллекции записей, без учета даты их публикации.

Есть ли советы, как изменить этот запрос, чтобы получить только последние "n" записей, а затем отсортировать только эти 5 по заголовку.

(Примечание: Меня особенно интересует запрос get_p() внутри элемента UL. Первый запрос ($myquery) здесь только для проверки наличия записей перед продолжением.)

function recent_posts(){
    $catHidden=get_cat_ID('hidden');
    $myquery = new WP_Query();
    $myquery->query(array('cat' => "-$catHidden",'post__not_in' => get_option('sticky_posts')));
    $myrecentpostscount = $myquery->found_posts;
    if ($myrecentpostscount > 0){ ?>
    <ul>
    <?php 
    global $post;
    if(get_option('mySort') == 'asc'){
        $sortOrder='title';$sortDirection='asc';
    }
    $myrecentposts = get_posts
    (
        array
        (
            'post__not_in' => get_option('sticky_posts'), 
            'cat' => "-$catHidden",
            'numberposts' => get_option('cb2_latest_count'),
            'orderby' => $sortOrder,
            'order' => $sortDirection
        )
    );

    foreach($myrecentposts as  $idxrecent=>$post) { 
        //ОТРИСОВКА МЕНЮ ЗАПИСЕЙ
    }
wp_reset_postdata();
}
1
Комментарии

Я думаю, суть проблемы в том, что, похоже, нет способа сначала выбрать только последние 5 записей, а затем отсортировать только их по заголовку. Когда я применяю сортировку к запросу, вместо того чтобы сначала получить последние 5 записей и отсортировать их, сортировка применяется ко всей коллекции записей.

Scott B Scott B
23 июн. 2011 г. 18:27:32
Все ответы на вопрос 2
4

$yourquery = new WP_Query('posts_per_page=5&orderby=title'); сделает это.


Редактирование Добавленный ответ

<?php 
$posts = new WP_Query('posts_per_page=5');
foreach($posts->posts as $post){
    $sorted[$post->ID] =  $post->post_title;
}
asort($sorted, SORT_STRING);

foreach($sorted as $k=>$v){
        //ваш цикл -- используйте ID для вызова каждого элемента
    the_title($k);
    the_content($k);
}
?>
23 июн. 2011 г. 00:20:24
Комментарии

Спасибо за ответ, MF, но я еще не совсем разобрался. Думаю, что может сбивать с толку то, что меня действительно беспокоит второй запрос, get_posts(). Он все еще выбирает из всей коллекции записей, а не из последних 5

Scott B Scott B
23 июн. 2011 г. 15:56:43

почему бы вам сначала не получить их, а затем не отсортировать? Если ваша проблема в том, что вы получаете не те записи, сначала получите нужные, а потом упорядочьте их.

Mild Fuzz Mild Fuzz
23 июн. 2011 г. 22:17:46

Да, именно это я и хочу сделать. Однако, когда у вас есть последние 5 записей, они уже упорядочены по дате (сначала самые новые). Я хочу затем взять эти 5 записей и отсортировать их по алфавиту перед тем, как передавать их в цикл for. Как тогда указать циклу for, в каком порядке их располагать?

Scott B Scott B
24 июн. 2011 г. 00:05:37

это должно сработать. (см. правку.)

Mild Fuzz Mild Fuzz
24 июн. 2011 г. 00:32:27
0

используйте следующий код и измените его по своему усмотрению:

// получить последние пять записей
$latestposts = get_posts(); // по умолчанию выбираются последние 5 записей
// получить только ID записей
$keys = array_keys($latestposts);
// получить те же 5 записей, но отсортированные по заголовку
$fivepostsorderedbytitle = get_posts(array('orderby' => 'post_title', 'post__in' => $keys));
24 июн. 2011 г. 00:57:38