Это постоянный запрос, пытающийся максимально увеличить некоторый код для отображения списка размещения по странам, определенному типу и определенному региону.
Так, например, список ВСЕХ вариантов размещения во ФРАНЦИИ, по рейтингу отеля (1,2,3,4,5), а затем по региону (Париж, Марсель и т. д.).
-Отель
1Star —Марсель
—Отель 1
—Отель 2 —
Париж
—Отель 1
—Отель 2
-Отель 2Star и
т.д.. и т.д…
Каждая запись в отеле представляет собой пользовательский пост под названием «Размещение». У меня есть 3 таксономии, страны (например, Франция), тип размещения (например, отель 1 звезда), регион (например, Париж).
Перечень жилья «живет» на странице страны, поэтому значение страны уже известно. (т.е. $termcountry->имя)
Мой код ниже:
$taxonomy2 = 'accomodation-type';
$termsacc = get_terms("accomodation-type",array('orderby' => 'slug', 'order' => 'ASC'));
foreach ($termsacc as $termaccomodation) {
$taxonomyregion = 'region';
$termsreg = get_terms("region",array('orderby' => 'slug', 'order' => 'ASC'));
foreach ($termsreg as $termregion) {
$query = array(
'post_type' => 'accomodation',
'accomodation-type' =>$termaccomodation->name,
'country' =>$termcountry->name,
'orderby' => 'title',
'order' => 'ASC',
'posts_per_page' => 48,
'tax_query' => array(
array(
'taxonomy' => $taxonomyregion,
'field' => 'slug',
'terms' => $termregion->name,
'orderby' => 'title',
'order' => 'ASC',
)
)
);
query_posts($query);
$count = 1; //First we set the count to be zeo
if(have_posts() ) {
$termaccomodation->slug = str_replace("%e2%80%98", "", $termaccomodation->slug);
$termaccomodation->slug = str_replace("%e2%80%99", "", $termaccomodation->slug);
if($termregion->name=="General"){
$regionname = "";
}else{
$regionname = " - ".$termregion->name;
}
$id = '';
$new_id = ++ $id;
?>
<a name="<?php echo $new_id."-".$termaccomodation->slug."-".$termregion->slug;?>"></a>
<div id="accitem">
<?php echo "<h3>".$termaccomodation->name."".$regionname."</h3>";?>
<?
while (have_posts()) : the_post();
$linkacc = get_custom_field("AccomodationLink");
?>
I do my loop stuff and display the accom list.
then close my loop
<?php endwhile; wp_reset_query();?>
Это работает, но ОЧЕНЬ МЕДЛЕННО… и я почти уверен, что это не оптимальный/лучший способ сделать это. Могу я пораскинуть мозгами по этому поводу? Помощь!
ура с
Просто отвечаю здесь понемногу и добавлю любые оптимизации, которые я вижу по мере продвижения:
1)
$termsreg = get_terms("region",array('orderby' => 'slug', 'order' => 'ASC'));
можно запустить над циклом foreach. Нет необходимости запускать это сколько угодно раз.2) Все ли ваши отели, которые вы указали в пользовательском типе сообщений, перечислены где-нибудь на этой странице? Если во время этого двойного цикла все ваши отели будут показаны хотя бы один раз, то было бы лучше сначала загрузить все ваши отели в массив вместе с налогами, которым они принадлежат. затем в foreach проверьте данные, которые вы уже получили, а затем покажите отель, а не каждый раз захватывайте его из БД. Что бы я сделал, чтобы получить данные об отелях, в первую очередь, это пользовательский SQL-запрос, чтобы убедиться, что я вытащил только те данные, которые мне нужны, и вытащил оба связанных налога.
Это все, что я придумал на данный момент.