это стандартный запрос вордпресса
вообще в вп содержится куча готовых функций, которые покрывают 80-90% потребностей начинающих разработчиков - возможно для вашей задачи уже существует готовый велосипед?
попробуйте в гугле вбить codex wordpress
можно предположить что вы хотите сделать для одних рубрик/страниц один вывод инфы, а для других - другой
это можно сделать гораздо проще без условий - просто вписав код в разных файлах - например index.php и category.php
У меня есть многофункциональная тема для ВП со своими виджетами в functions.php Там очень удобно настраивается вывод постов с превью (за отображение отвечает тело цикла и оно большое, т. к. там предусмотрен вывод в несколько колонок, с тайтлом/без, с превью/без, дата, автор, описание и т.п.
-вывод новых
-вывод новых из категории
-вывод новых текущей категории
-рандомный вывод
и все это до цикла с выводом собирается запросом
PHP:
$cat_posts = new WP_Query ...
проблема этого в том что всегда происходит сортировка постов либо по возрастанию либо по убыванию
Но я хочу сделать еще вывод похожих новостей который очень умно выводит предидущие посты из текущей категории, а если их не хватает, то добирает первые из той же категории и при этом сортировки не происходит. То что мне и надо.
Вот эта функция, которая возвращает массив с нужными постами:
PHP:
function show_previous_posts_from_category ($the_post_id, $the_category_id = 0, $post_num) {
$num = 0;
global $wpdb;
$sql = "SELECT wposts.*
FROM $wpdb->posts wposts
LEFT JOIN $wpdb->term_relationships ON (wposts.ID = $wpdb->term_relationships.object_id)
LEFT JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
WHERE $wpdb->term_taxonomy.taxonomy = 'category'
AND $wpdb->term_taxonomy.term_id = '$the_category_id'
AND wposts.post_status = 'publish'
AND wposts.post_type = 'post'
AND wposts.ID < '$the_post_id'
ORDER BY wposts.ID DESC
LIMIT $post_num";
$result = $wpdb->get_results($sql, OBJECT);
global $post;
foreach ($result as $post) {
setup_postdata($post);
$cat_posts[] = $post;
$num++;
$save_ids[] = $post->ID;
}
if ( $num < $post_num || !$result ) {
$need_more = $post_num-$num;
$save_ids[] = $the_post_id;
$save_ids = join (',', $save_ids);
$more_posts = get_posts("numberposts=$need_more&category=$the_category_id&exclude=$save_ids");
foreach ($more_posts as $post){
setup_postdata($post);
$cat_posts[] = $post;
}
}
return $cat_posts;
}
Вопрос только как сделать чтобы при одном условии в цикле выводить посты собранные этой функцией, а при другом
PHP:
$cat_posts = new WP_Query ...
На этом сайте как раз рассмотрены 2 способа вывода похожих записей как у меня
В каждом из способов использованы разные конструкции циклов (в первом foreach ($more_posts as $post), во втором while ($my_query->have_posts())), а тело вывода постов можно сказать одинаковое (<li><a href="<?php the_permalink() ?>" rel="bookmark"><?php the_title(); ?></a></li>)
Только в моем случае тело вывода постов намного сложнее. Вот я и хочу объединить эти 2 способа поставив условие для применения одного или другого при этом тело цикла для вывода постов применить в коде 1 раз