@Alex-Broudy

Как прописать условия вывода постов для цикла WP_Query в функции в functions.php?

На сайте есть как общие разделы, так и ГЕО страницы, на которых должны выводиться витрины с продукцией, доставка которой осуществляется либо по все России, либо в конкретных городах. Так же созданы термины витрин по категориям продукции у таксономии "Витрина" (vitrina).

В произвольном типе записи "Продукция" (тип поста "product") в записях добавлено произвольное поле ACF (checkbox) под названием "Города" (set_city) и в каждой записи продукции проставлены галки по соответствующим городам, либо выбрано значение "Все города", если доставка продукции осуществляется по всей России.

Изначально, была задача создать функцию вывода записей "Продукция" через шорткод в любом месте сайта, но с условием, что показываться записи в цикле будут только те, которые прикреплены к соответствующему термину таксономии "Витрина" и значение произвольного поля set_city в записи будет выбрано название города или "Все города" (если это ГЕО страница) или выводиться будут все записи, если это общий раздел (страницы post или page).

Как выглядят общие разделы: сайт.ру/products/mebel/
Как выглядят ГЕО страницы: сайт.ру/murmansk/products/mebel/

Код функции был реализован через get_posts:

add_shortcode('vitrina','vitrina');

function vitrina($attr)
	{
		$vitrina_id = $attr['id'];
		$vitrina = get_term($vitrina_id,'vitrina');

		// получаем заголовок родительской страницы самого верхнего уровня, которая будет являться страницей города 
		//и не важно на какой из страниц находимся - нам будет показано название города
		$post_id = get_the_ID(); 	
		$ids = get_post_ancestors( $post_id ); 
		$id  = array_pop( $ids ); 
		$title_of_parent_post_city_name = get_the_title( $id ); 
	
		$args = array
			(
				'post_type'		=> 'product',
				'numberposts'	=> -1,
			);
		$products = get_posts($args);

		$return = "<div class='vitrina'>";

			foreach ($products as $product)
			{
				$name_of_city_by_product = get_field('set_city',$product->ID);
				if( has_term( $vitrina_id, 'vitrina', $product ) )
					{
						// условие - показываем все записи в типах поста post и page или только те записи, в которых название выбранного города соответствует названию города ГЕО страницы, на которой осуществляется вывод записей и который мы определили по заголовку родительской страницы самого верхнего уровня
                                               if( $name_of_city_by_product && in_array($title_of_parent_post_city_name, $name_of_city_by_product) || in_array('Все города', $name_of_city_by_product) || is_singular( ['post', 'page'] ) )
							{
								$return .= get_product($product); // содержимое поста (отдельная функция)
							}
					}
			}
		
		$return .= "</div>";
		
		return $return;
		
	}


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

Нашел решение и попытался реализовать функцию через WP_Query и пагинация заработала, но не хватает знаний, чтобы в эту новую функцию прописать условия для ГЕО страниц, как было ранее.

Новый код функции:

add_shortcode('vitrina','vitrina');

function vitrina($attr)
	{
		$vitrina_id = $attr['id'];
		$vitrina = get_term($vitrina_id,'vitrina');
		$vitrina_slug = $vitrina->slug;

		$post_id = get_the_ID(); 	
		$ids = get_post_ancestors( $post_id );
		$id  = array_pop( $ids ); 
		$title_of_parent_post_city_name = get_the_title( $id ); 
	        $name_of_city_by_product = get_field('set_city',$product->ID);
		$args = array
			(
				'post_type'		=> 'product',
				'numberposts'	=> -1,
				'vitrina'    => $vitrina_slug,
			);
		
		$args['paged'] = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
		$products = new WP_Query( $args );
		$GLOBALS['wp_query']->max_num_pages = $products->max_num_pages;

		$return = "<div class='vitrina'>";

			while ( $products->have_posts() ) : $products->the_post();
				$return .= get_product($product); // содержимое поста (отдельная функция)
			endwhile;
		
		$return .= "</div>";
		
		$btr_pag = the_posts_pagination();
		return $return;
		print_r($btr_pag);
		
	}


т.е. нужно прописать как-то вот это условие в новой функции:

if( $name_of_city_by_product && in_array($title_of_parent_post_city_name, $name_of_city_by_product) || in_array('Все города', $name_of_city_by_product) || is_singular( ['post', 'page'] ) )
  • Вопрос задан
  • 169 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

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