На сайте есть как общие разделы, так и ГЕО страницы, на которых должны выводиться витрины с продукцией, доставка которой осуществляется либо по все России, либо в конкретных городах. Так же созданы термины витрин по категориям продукции у таксономии "Витрина" (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'] ) )