05 β The Loop va WP_Query¶
β¬ οΈ Oldingi: 04 β Tema anatomiyasi va standartlar Β· π README Β· Keyingi: 06 β Template teglar va shartli teglar β‘οΈ
Bu bobda: WordPress sahifaga kirilganda postlarni qanday topib chiqarishini o'rganamiz. "The Loop" β klassik temaning yuragi:
have_posts()vathe_post()bilan har bir postni navbatma-navbat chiqaramiz. Keyinnew WP_Query()orqali o'z so'rovlarimizni yasaymiz (oxirgi postlar, aloqador postlar) vawp_reset_postdata()bilan nega tozalash shartligini ko'ramiz. Oxiridapre_get_postsbilan asosiy so'rovni ham o'zgartiramiz.
Asosiy so'rov (main query): WordPress siz so'ramasdan ish qiladi¶
03-bobda ko'rgan edik: foydalanuvchi https://saytim.uz/blog/ ga kirsa, WordPress URL'ni o'qiydi, ma'lumotlar bazasiga so'rov yuboradi va mos postlarni topadi. Bu asosiy so'rov (main query) deyiladi β uni siz yozmaysiz, WordPress avtomatik bajaradi.
Hayotiy o'xshatish: restoranga kirasiz, ofitsiant siz so'ramasdan menyu va suv keltiradi. "Menyu" β bu asosiy so'rov natijasi. Siz faqat menyuni qanday ko'rsatishni hal qilasiz (chiroyli stolga qo'yasizmi yoki devorga osasizmi). Tema aynan shu β natijani ko'rsatish bilan shug'ullanadi, topish bilan emas.
Natija temaga global $wp_query obyektida yetib keladi. Lekin biz unga to'g'ridan-to'g'ri tegmaymiz β o'rniga qulay funksiyalardan foydalanamiz: have_posts() va the_post().
Tushuncha: "so'rov" (query) β bu bazadan ma'lumot olish buyrug'i. WordPress uni SQL'ga aylantiradi. Biz SQL yozmaymiz, faqat qanday postlar kerakligini aytamiz.
The Loop anatomiyasi¶
"The Loop" (Sikl) β postlarni birma-bir chiqaradigan standart PHP konstruksiyasi. Eng sodda ko'rinishi:
if ( have_posts() ) :
while ( have_posts() ) :
the_post();
the_title( '<h2>', '</h2>' );
the_content();
endwhile;
else :
echo '<p>Hech narsa topilmadi.</p>';
endif;
Bu yerda uchta kalit funksiya bor:
| Funksiya | Vazifasi |
|---|---|
have_posts() |
Ko'rsatiladigan post qolganmi? true/false qaytaradi. |
the_post() |
Keyingi postga o'tadi va uni "joriy post" qilib tayyorlaydi (global $post ni sozlaydi). |
the_title(), the_content() ... |
Joriy postning ma'lumotlarini chiqaradi. |
Ishlash mantig'i:
if ( have_posts() )β umuman post bormi? Bo'lmasaelseishlaydi.while ( have_posts() )β har takrorda yana post bor-yo'qligini tekshiradi.the_post()β ichki "kursor"ni keyingi postga suradi. Endithe_title()aynan shu postni biladi.- Oxirgi postdan keyin
have_posts()falseqaytaradi vawhileto'xtaydi.
Diqqat:
the_post()niwhileichida CHAQIRISH SHART. Usizthe_title()doim bitta postni ko'rsatadi vawhilecheksiz aylanadi.
endwhile / endif sintaksisi nega?¶
Temalarda HTML bilan PHP aralashganda { } o'rniga : va endwhile;/endif; ishlatish odat. Sababi β o'qish oson: HTML ichida qaysi blok qayerda tugayotgani aniq ko'rinadi. Ikkalasi ham bir xil ishlaydi, lekin tema fayllarida : uslubi standart.
Loop ichidagi ma'lumot: template teglar¶
Loop ichida joriy postning turli qismlarini chiqaradigan funksiyalar bor. Ularning ko'pchiligi ikki shaklda keladi:
the_*β ekranga chiqaradi (echo qiladi).get_the_*β qiymatni qaytaradi (o'zgaruvchiga olish yoki escape qilish uchun).
Eng ko'p ishlatiladiganlari:
| Funksiya | Nima chiqaradi |
|---|---|
the_title() |
Post sarlavhasi |
the_content() |
To'liq post matni (HTML bilan) |
the_excerpt() |
Qisqacha (anons) |
the_permalink() |
Post URL'i (havola uchun) |
the_post_thumbnail() |
Asosiy rasm (featured image) |
the_author() |
Muallif ismi |
the_date() |
Nashr sanasi |
the_ID() |
Post ID raqami |
Muhim qoida (27-bobda chuqur): sana, muallif kabi ma'lumotlarni o'zgaruvchidan chiqarganda escape qiling β masalan
echo esc_html( get_the_date() ).the_content()esa allaqachon WordPress tomonidan tozalanadi.
To'liq blog loop¶
Mana real index.php da ishlatiladigan to'liq blog sikli:
if ( have_posts() ) :
while ( have_posts() ) :
the_post();
?>
<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<header class="entry-header">
<h2 class="entry-title">
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</h2>
<p class="entry-meta">
<?php the_author(); ?> · <?php echo esc_html( get_the_date() ); ?>
</p>
</header>
<?php if ( has_post_thumbnail() ) : ?>
<div class="entry-thumb">
<a href="<?php the_permalink(); ?>">
<?php the_post_thumbnail( 'medium' ); ?>
</a>
</div>
<?php endif; ?>
<div class="entry-summary">
<?php the_excerpt(); ?>
</div>
</article>
<?php
endwhile;
the_posts_pagination();
else :
?>
<p>Hozircha post yo'q.</p>
<?php
endif;
E'tibor bering:
post_class()β postga foydali CSS klasslar qo'shadi (post,category-...,stickyva h.k.). 06-bobda batafsil.has_post_thumbnail()β rasm bormi tekshiradi, bo'lmasa bo'sh<div>chiqmaydi.the_posts_pagination()β sahifalash havolalarini chiqaradi (1, 2, 3...). Bu main query uchun avtomatik ishlaydi.
Jonli tekshiruv: bu loop mantig'i WP 7.0 da haqiqatan ishlaydi. Pastda
WP_Querybo'limida xuddi shu sikl orqali olingan haqiqiy natijani ko'rasiz.
Ikkilamchi so'rov: new WP_Query($args)¶
Asosiy so'rov joriy sahifaga mos postlarni beradi. Lekin ko'pincha bizga boshqa postlar ham kerak bo'ladi: yon panelga "oxirgi 3 post", maqola tagiga "aloqador postlar", bosh sahifaga "tanlangan mahsulotlar".
Buning uchun ikkilamchi so'rov yasaymiz β WP_Query klassidan o'z obyektimizni yaratamiz va unga nima kerakligini $args massivida aytamiz:
$args = array(
'post_type' => 'post',
'posts_per_page' => 3,
'orderby' => 'date',
'order' => 'DESC',
);
$ikkilamchi = new WP_Query( $args );
if ( $ikkilamchi->have_posts() ) :
while ( $ikkilamchi->have_posts() ) :
$ikkilamchi->the_post();
the_title( '<h3>', '</h3>' );
endwhile;
wp_reset_postdata(); // SHART!
endif;
Farqni sezdingizmi? Asosiy so'rovda have_posts() ni to'g'ridan-to'g'ri chaqirardik. Ikkilamchi so'rovda esa obyekt orqali: $ikkilamchi->have_posts(), $ikkilamchi->the_post(). Sababi β bu boshqa, alohida so'rov natijasi.
Asosiy WP_Query parametrlari¶
$args massivida o'nlab parametr bor. Eng muhimlari:
| Parametr | Misol | Vazifasi |
|---|---|---|
post_type |
'post', 'product', 'page' |
Qaysi turdagi yozuvlar |
posts_per_page |
6, -1 (hammasi) |
Nechta post olish |
orderby |
'date', 'title', 'rand', 'meta_value_num' |
Qaysi maydon bo'yicha tartib |
order |
'ASC', 'DESC' |
O'sish yoki kamayish |
post__in |
array(12, 45, 7) |
Faqat shu ID'lardagi postlar |
category_name |
'yangiliklar' |
Kategoriya slug'i bo'yicha |
meta_query |
massiv | Custom field (meta) bo'yicha filtr |
tax_query |
massiv | Taksonomiya (kategoriya/teg) bo'yicha filtr |
meta_query bilan filtr¶
Custom field (post meta β 14-bobda chuqur) bo'yicha filtrlash. Masalan, "tavsiya etiladi" belgisi qo'yilgan mahsulotlar:
$tavsiya = new WP_Query( array(
'post_type' => 'product',
'posts_per_page' => 6,
'meta_query' => array(
array(
'key' => 'tavsiya_etiladi',
'value' => '1',
'compare' => '=',
),
),
) );
wp_reset_postdata();
meta_query β bu massivlar massivi. Har bir ichki massiv bitta shartni bildiradi: key (maydon nomi), value (qiymat), compare (=, !=, >, LIKE, IN ...).
tax_query bilan filtr¶
Kategoriya, teg yoki custom taksonomiya bo'yicha. Masalan, ikki kategoriyadagi postlar:
$texnologiya = new WP_Query( array(
'post_type' => 'post',
'tax_query' => array(
array(
'taxonomy' => 'category',
'field' => 'slug',
'terms' => array( 'texnologiya', 'dasturlash' ),
),
),
) );
wp_reset_postdata();
Jonli tekshiruv:
meta_queryvatax_queryhaqiqiyWP_Queryargumentlari. WP 7.0 da bu so'rovlarni ishga tushirib, hosil qilingan SQL ichidatavsiya_etiladimeta-ulanishini vaterm_taxonomyJOIN'ini ko'rdik β demak parametrlar ixtiro qilinmagan, WordPress ularni haqiqatan tushunadi.
wp_reset_postdata() β nega SHART?¶
Bu eng ko'p uchraydigan xato. the_post() (yoki $obyekt->the_post()) global $post o'zgaruvchisini joriy postga o'rnatadi. Ikkilamchi loop tugagach, $post oxirgi ikkilamchi postda qolib ketadi. Endi sahifaning qolgan qismida the_title() chaqirsangiz β u asosiy postni emas, ikkilamchi so'rovning oxirgi postini ko'rsatadi. Natija β chalkash, "g'alati" temalar.
wp_reset_postdata() global $post ni asosiy so'rovning joriy postiga qaytaradi. Qoida sodda:
Har bir
new WP_Query+ loop tugagach,wp_reset_postdata()chaqir. Istisno yo'q.
Anti-misol β buni unutsangiz:
$q = new WP_Query( array( 'posts_per_page' => 3 ) );
while ( $q->have_posts() ) : $q->the_post();
the_title();
endwhile;
// wp_reset_postdata() YO'Q -> xato boshlanadi
the_title(); // bu endi asosiy postni EMAS, ikkilamchi so'rovning oxirgi postini beradi
Eslatma:
query_posts()degan eski funksiya ham bor β u asosiy so'rovni qayta yuradi va pagination'ni buzadi. Hech qachon ishlatmang. Ikkilamchi so'rov uchunnew WP_Query, asosiy so'rovni o'zgartirish uchunpre_get_posts(pastda).
pre_get_posts β asosiy so'rovni o'zgartirish¶
Ba'zan ikkilamchi so'rov emas, balki asosiy so'rovning o'zini o'zgartirmoqchimiz. Masalan: "bosh sahifada 6 ta emas, 10 ta post chiqsin" yoki "qidiruv faqat postlar ichidan qidirsin".
Ikkilamchi WP_Query bu yerda noto'g'ri yo'l β chunki asosiy ro'yxat pagination, SEO va shartli teglar bilan bog'liq. To'g'ri yo'l β pre_get_posts hooki. U asosiy so'rov SQL'ga aylanmasdan oldin ishlaydi va so'rov parametrlarini o'zgartirishga imkon beradi:
function blog_main_query( $query ) {
// admin panelga va ikkilamchi so'rovlarga tegmaymiz!
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
if ( $query->is_home() ) {
$query->set( 'posts_per_page', 6 );
}
}
add_action( 'pre_get_posts', 'blog_main_query' );
Bu yerdagi ikki tekshiruv KRITIK:
is_admin()β admin paneldagi so'rovlarni o'zgartirmaslik uchun (aks holda boshqaruv buziladi).$query->is_main_query()βpre_get_postsHAR bir so'rovda (shu jumladan sizningWP_Querylaringizda) ishlaydi. Bu tekshiruvsiz barcha so'rovni buzib qo'yasiz.
$query->set( 'kalit', qiymat ) β so'rov parametrini o'rnatadi. pre_get_posts ichida the_post() yoki HTML chiqarmang β bu faqat so'rovni sozlaydi, chiqarish loop'da bo'ladi.
Jonli tekshiruv: WP 7.0 da
pre_get_postshaqiqiy action ekanini tasdiqladik β unga callback ulagachhas_action('pre_get_posts')trueqaytardi.
get_posts() β qisqa yo'l¶
Faqat postlar massivi kerak bo'lsa (HTML chiqarish kerak bo'lmasa, masalan ID'lar ro'yxati), get_posts() qulayroq. U WP_Query ustiga sodda o'ram:
$oxirgi = get_posts( array(
'numberposts' => 3, // diqqat: posts_per_page emas, numberposts
'post_status' => 'publish',
'orderby' => 'date',
'order' => 'DESC',
) );
foreach ( $oxirgi as $post ) {
setup_postdata( $post );
echo esc_html( get_the_title() );
}
wp_reset_postdata();
Farqlar:
get_posts()massiv qaytaradi βhave_posts()loop'i shart emas, oddiyforeach.- Parametr nomi
numberposts(posts_per_pageham ishlaydi, lekin standartnumberposts). the_*template teglarini ishlatmoqchi bo'lsangizforeachichidasetup_postdata( $post )chaqirib, oxirida baribirwp_reset_postdata()qiling.
Qachon nima: murakkab loop (HTML, pagination) kerak bo'lsa β
WP_Query. Faqat oddiy ro'yxat (sarlavhalar, ID'lar) kerak bo'lsa βget_posts().
Amaliy: "oxirgi 3 post" widget bo'lagi¶
Endi haqiqiy, ishlatsa bo'ladigan bo'lak yasaymiz. Buni sidebar.php ga yoki get_template_part() orqali alohida faylga joylaysiz (08-bobda):
<?php
$oxirgi_postlar = new WP_Query( array(
'post_type' => 'post',
'posts_per_page' => 3,
'orderby' => 'date',
'order' => 'DESC',
'ignore_sticky_posts' => true,
'no_found_rows' => true, // pagination kerak emas -> tezroq
) );
if ( $oxirgi_postlar->have_posts() ) : ?>
<aside class="widget widget-oxirgi-postlar">
<h3 class="widget-title">Oxirgi yangiliklar</h3>
<ul>
<?php while ( $oxirgi_postlar->have_posts() ) : $oxirgi_postlar->the_post(); ?>
<li>
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
<time datetime="<?php echo esc_attr( get_the_date( 'c' ) ); ?>">
<?php echo esc_html( get_the_date() ); ?>
</time>
</li>
<?php endwhile; ?>
</ul>
</aside>
<?php
wp_reset_postdata(); // global $post ni asosiy so'rovga qaytar
endif;
Performans uchun ikki foydali parametr:
ignore_sticky_posts => trueβ yopishtirilgan (sticky) postlarni majburlamaydi, faqat sof oxirgi 3 ta.no_found_rows => trueβ pagination uchun umumiy sonni hisoblamaydi (bizga kerak emas), so'rov tezroq.
Jonli WP 7.0 natijasi (READ-ONLY): jonli saytda 3 ta namuna post yaratib (
wp post generate --count=3), aynan shuWP_Querymantig'ini (post_type=post, posts_per_page=3, orderby=date, order=DESC)wp eval-fileorqali ishga tushirdik. Haqiqiy chiqindi:So'rov eng yangi 3 postni to'g'ri tartibda qaytardi,
wp_reset_postdata()keyin xatosiz ishladi. Aktiv tema o'zgartirilmadi β bu faqat o'qish/tekshirish edi.
Xulosa¶
- WordPress asosiy so'rovni (main query) avtomatik bajaradi; tema natijani chiqaradi.
- The Loop:
if ( have_posts() ) : while ( have_posts() ) : the_post(); ... endwhile; endif;. - Loop ichida
the_title,the_content,the_excerpt,the_permalink,the_post_thumbnail,the_author,the_datebilan ma'lumot chiqariladi. - O'z so'rovingiz uchun
new WP_Query($args); tugagachwp_reset_postdata()SHART. - Asosiy so'rovni o'zgartirish uchun
pre_get_posts(admin va main-query tekshiruvi bilan). - Oddiy ro'yxat uchun
get_posts().
Keyingi bobda template teglar va shartli teglar (is_single, is_home...) bilan kontekstga qarab turli HTML chiqarishni o'rganamiz.
Mashqlar¶
Oson¶
- Eng sodda loop. Asosiy so'rov uchun The Loop yozing: har bir postning sarlavhasini
<h2>ichida chiqaring, post bo'lmasa "Post topilmadi" deb yozing. - Havolali ro'yxat. The Loop bilan postlar sarlavhalarini
<ul><li>ro'yxat qilib chiqaring, har sarlavha o'z postiga havola (the_permalink) bo'lsin. - Meta ma'lumot. Loop ichida har postning muallifi va sanasini bitta
<p class="meta">qatorida chiqaring (sanani escape qiling). - Rasm shart bilan. Loop ichida faqat asosiy rasmi bor postlar uchun
the_post_thumbnail('medium')chiqaring; rasmsiz postlarda hech narsa chiqmasin.
O'rta¶
- Oxirgi 5 post (ikkilamchi).
new WP_Querybilan eng yangi 5 ta postni oling va sarlavhalarini ro'yxat qiling.wp_reset_postdata()ni unutmang. - Eng ko'p izohli postlar.
WP_Querybilan izohlar soni bo'yicha kamayuvchi tartibda 5 ta postni chiqaring (orderby => 'comment_count'). - Muallif bo'yicha.
WP_Querybilan ma'lum bir muallifning (author_name => 'oqil') so'nggi 4 postini chiqaring. - get_posts. Xuddi 5-mashqni
WP_Queryo'rnigaget_posts()+foreach+setup_postdata()bilan qayta yozing.
Qiyin¶
- pre_get_posts: bosh sahifa.
pre_get_postsbilan bosh sahifada (is_home) faqatyangiliklarkategoriyasidan 8 ta post chiqadigan qiling.is_admin()vais_main_query()tekshiruvlarini qo'shing. - pre_get_posts: qidiruv.
pre_get_postsbilan qidiruv natijalarini faqatpostturiga cheklang (CPT'lar qidiruvga tushmasin). - XATO toping va tuzating. Quyidagi kodda nima xato? Toping va tuzating:
$q = new WP_Query(array('posts_per_page'=>3)); while($q->have_posts()): $q->the_post(); the_title(); endwhile; the_title(); - Narx bo'yicha tartib.
productturidagi postlarninarxcustom field'i bo'yicha o'suvchi tartibda (meta_key+orderby => 'meta_value_num') 10 ta chiqaring. - Filtrlarni birlashtirish.
WP_Querybilan:noutbuktaksonomiya termasidagi (tax_query) VA omborda mavjud (omborda = 1) VA narxi 5 000 000 dan kam (narx <= 5000000, NUMERIC) mahsulotlarni oling.meta_querydarelation => 'AND'ishlating.
Yechimlar¶
Yechim β 1
if ( have_posts() ) :
while ( have_posts() ) : the_post();
the_title( '<h2>', '</h2>' );
endwhile;
else :
echo '<p>Post topilmadi.</p>';
endif;
the_title( '<h2>', '</h2>' ) β birinchi argument oldidagi, ikkinchisi keyingi HTML. Bu <h2><?php the_title(); ?></h2> ning qisqa shakli.
Yechim β 2
if ( have_posts() ) : ?>
<ul>
<?php while ( have_posts() ) : the_post(); ?>
<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php endwhile; ?>
</ul>
<?php endif;
<ul> ni loop'dan TASHQARIDA bir marta ochamiz, <li> ni loop ICHIDA takrorlaymiz.
Yechim β 3
while ( have_posts() ) : the_post(); ?>
<p class="meta">
<?php the_author(); ?> · <?php echo esc_html( get_the_date() ); ?>
</p>
<?php endwhile;
Sanani get_the_date() orqali olib esc_html() bilan escape qildik (xavfsizlik odati β 27-bob). the_author() allaqachon to'g'ri chiqaradi.
Yechim β 4
while ( have_posts() ) : the_post();
if ( has_post_thumbnail() ) {
the_post_thumbnail( 'medium' );
}
endwhile;
has_post_thumbnail() rasm borligini tekshiradi β shu tufayli rasmsiz postlarda hech narsa chiqmaydi.
Yechim β 5
$oxirgi = new WP_Query( array(
'post_type' => 'post',
'posts_per_page' => 5,
'orderby' => 'date',
'order' => 'DESC',
) );
if ( $oxirgi->have_posts() ) : ?>
<ul>
<?php while ( $oxirgi->have_posts() ) : $oxirgi->the_post(); ?>
<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php endwhile; ?>
</ul>
<?php wp_reset_postdata();
endif;
Ikkilamchi so'rovda have_posts() va the_post() ni OBYEKT orqali ($oxirgi->) chaqiramiz. Oxirida wp_reset_postdata().
Yechim β 6
$mashhur = new WP_Query( array(
'post_type' => 'post',
'posts_per_page' => 5,
'orderby' => 'comment_count',
'order' => 'DESC',
) );
while ( $mashhur->have_posts() ) : $mashhur->the_post();
the_title( '<li>', '</li>' );
endwhile;
wp_reset_postdata();
orderby => 'comment_count' β izohlar soni bo'yicha. order => 'DESC' β eng ko'pdan eng ozga.
Yechim β 7
$muallif_postlari = new WP_Query( array(
'author_name' => 'oqil', // foydalanuvchi login slug'i
'posts_per_page' => 4,
) );
while ( $muallif_postlari->have_posts() ) : $muallif_postlari->the_post();
the_title( '<h3>', '</h3>' );
endwhile;
wp_reset_postdata();
author_name β foydalanuvchining user_nicename (login slug). ID bilan kerak bo'lsa author => 5 ishlatiladi.
Yechim β 8
$oxirgi = get_posts( array(
'numberposts' => 5,
'orderby' => 'date',
'order' => 'DESC',
) );
echo '<ul>';
foreach ( $oxirgi as $post ) {
setup_postdata( $post );
printf(
'<li><a href="%s">%s</a></li>',
esc_url( get_permalink() ),
esc_html( get_the_title() )
);
}
echo '</ul>';
wp_reset_postdata();
get_posts() massiv beradi. the_* teglarini ishlatish uchun foreach ichida setup_postdata($post), oxirida wp_reset_postdata(). Bu yerda URL va sarlavhani escape qildik.
Yechim β 9
functions.php ga:
function bosh_kategoriya( $query ) {
if ( ! is_admin() && $query->is_main_query() && $query->is_home() ) {
$query->set( 'category_name', 'yangiliklar' );
$query->set( 'posts_per_page', 8 );
}
}
add_action( 'pre_get_posts', 'bosh_kategoriya' );
Uchta shart birga: admin EMAS, asosiy so'rov, VA bosh sahifa. Shundan keyingina parametrlarni o'zgartiramiz.
Yechim β 10
function faqat_post_qidiruv( $query ) {
if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
$query->set( 'post_type', 'post' );
}
}
add_action( 'pre_get_posts', 'faqat_post_qidiruv' );
$query->is_search() β qidiruv sahifasini aniqlaydi. post_type ni 'post' ga o'rnatib, CPT'larni natijadan chiqaramiz.
Yechim β 11
Xato: ikkilamchi loop tugagach wp_reset_postdata() chaqirilmagan. Shu sababli oxirgi the_title() asosiy postni emas, $q ning oxirgi postini ko'rsatadi.
Tuzatilgan:
$q = new WP_Query( array( 'posts_per_page' => 3 ) );
while ( $q->have_posts() ) : $q->the_post();
the_title();
endwhile;
wp_reset_postdata(); // <-- yetishmayotgan qator
the_title(); // endi to'g'ri: asosiy so'rovning joriy posti
Qoida: har new WP_Query + loop'dan keyin wp_reset_postdata().
Yechim β 12
$arzon = new WP_Query( array(
'post_type' => 'product',
'posts_per_page' => 10,
'meta_key' => 'narx',
'orderby' => 'meta_value_num',
'order' => 'ASC',
) );
while ( $arzon->have_posts() ) : $arzon->the_post();
the_title( '<li>', '</li>' );
endwhile;
wp_reset_postdata();
Son bo'yicha tartiblashda meta_value EMAS, meta_value_num ishlatiladi (aks holda matn sifatida tartiblanadi: "10" < "9"). meta_key ni ham berish SHART.
Yechim β 13
$saralangan = new WP_Query( array(
'post_type' => 'product',
'posts_per_page' => 12,
'tax_query' => array(
array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => 'noutbuk',
),
),
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'omborda',
'value' => '1',
'compare' => '=',
),
array(
'key' => 'narx',
'value' => 5000000,
'type' => 'NUMERIC',
'compare' => '<=',
),
),
) );
while ( $saralangan->have_posts() ) : $saralangan->the_post();
the_title( '<h3>', '</h3>' );
endwhile;
wp_reset_postdata();
tax_query va meta_query bir so'rovda birga ishlaydi (orasida AND). meta_query ichidagi relation => 'AND' ikki meta shartni birlashtiradi. Raqamli taqqoslashda type => 'NUMERIC' SHART, aks holda <= matn sifatida ishlaydi.
β¬ οΈ Oldingi: 04 β Tema anatomiyasi va standartlar Β· π README Β· Keyingi: 06 β Template teglar va shartli teglar β‘οΈ