like-a-boss
@like-a-boss
Признайся,тебяТянетНаКодМужика,ты—программный гей

Как сделать запрос wpdb, а затем привязать его к циклу?

Доброго дня,
такая ситуация:
нужно сначала сделать запрос в бд(получить посты определённого типа начинающиеся в данном примере с буквы A), а затем обработать полученные результаты в лупе

global $wpdb; 
         $request = 'a';
	 $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
	 $offset = 0;
if( isset($_GET['page']) && !empty($_GET['page']) ){
$offset =  ($_GET['page']-1) * 100;

$results = $wpdb->get_results("
                SELECT * FROM $wpdb->posts
                WHERE post_title LIKE '$request%'
                AND post_type = 'artist'
                AND post_status = 'publish'
		LIMIT 100 OFFSET $offset;
                ");

теперь нужно как-то привязать эти результаты к wp_query:
$wp_query = new WP_Query( array(
	'paged' => $paged) // чтобы работала пагинация
);		 
while ($wp_query->have_posts()) : $wp_query->the_post();
	$var = wp_get_post_terms( $post->ID, 'bands' );
	$slug = $var[0]->slug;
	$terms = get_terms('bands', 'slug=' . $slug . '');
		foreach ($terms as $term) { $t_count = $term->count;?>
			<li><a href="<?php echo the_permalink();?>" title="<?php echo the_title();?>"><?php echo the_title();?></a>
			<span class="text-right"><?php echo $t_count ;?></span></a></li>
		<?php }		
endwhile; 
wp_reset_postdata(); 
pagination($additional_loop->max_num_pages); //функция пагинации

Подскажите как это сделать?
  • Вопрос задан
  • 3436 просмотров
Пригласить эксперта
Ответы на вопрос 2
Может вам подойдёт другой способ. Запрашиваем нужные посты и уже у них проверяем первая буква "а" или нет.

Если нужно найти в постах определённую фразу, то у wp_query есть параметр поиска.
//Посты найденные по поисковой фразе.
$query = new WP_Query( 's=keyword' );


У вас ошибка the_permalink() и the_title() без аргумента сразу выводят ссылку и заголовок, echo лишнее.
// заместо проверки на пустоту, лучше 
// привести к целому числу 
// $_GET['page'] = 'не_число'
if ( isset($_GET['page']) && !empty($_GET['page']) )  // true
if( isset($_GET['page']) && absint($_GET['page']) )   // false


Пример с wp_query
<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$offset = 0;

if( isset($_GET['page']) && absint($_GET['page']) )
		$offset =  ($_GET['page']-1) * 100; 

$args = array(
	 'post_type' => 'artist' // тип поста
	,'post_status' => 'publish' // статус поста опубликованный
	,'paged' => $paged // страница пагинации
	,'offset' => 0 // сколько постов из результатов запроса пропустить.
	,'order' => 'ASC' // сортируем по порядку, от меньшего к большему (1, 2, 3; a, b, c).
	,'orderby' => 'title' // по заголовку поста
);
$query = new WP_Query( $args );	

while ($query->have_posts()) : $query->the_post();
  $var = wp_get_post_terms( $post->ID, 'bands' );
  $slug = $var[0]->slug;
  $terms = get_terms('bands', 'slug=' . $slug . '');

  foreach ($terms as $term) : 
	$t_count = $term->count;
?>
	<li>
	  <a href="<?php the_permalink();?>" title="<?php the_title();?>">
	  	<?php the_title();?>
	  </a>
	  <span class="text-right"><?php echo $t_count ;?></span>
	</li>
<?php 
	endforeach;		
endwhile; 
wp_reset_postdata(); 
pagination($additional_loop->max_num_pages); //функция пагинации
?>

Посты могут выводится не по порядку, если установлены плагины для создания пользовательских выводов постов.
Ответ написан
HeadOnFire
@HeadOnFire
PHP, Laravel & WordPress Evangelist
Есть у WP вот такая штука, pre_get_posts:
function my_modify_main_query( $query ) {
     $query->query_vars['posts_per_page'] = 5; // вносим изменения в запрос, таких строчек может быть много.
}
add_action( ‘pre_get_posts’, ‘my_modify_main_query’ );

Что делает: изменяет параметры основного запроса в БД до того, как он будет выполнен. Таким образом, полученные результаты будут доступны через стандартный wordpress loop - не нужно будет писать лишний код, да и темы вручную тюнить.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы