WordPress The Loop – जब User किसी Resource के लिए WordPress Powered Site/Blog पर कोई Request Perform करता है, तो उस Request को पूरा करने के लिए WordPress, Web Browser से Request के रूप में आने वाले Request Object के आधार पर MySQL Database पर किसी न किसी तरह ही Query Fire करता है।
परिणामस्वरूप MySQL Database से एक या एक से ज्यादा Results Generate होते हैं। इन Results को उपयोग में लिया जा सके, इसलिए WordPress इसे $wp_query नाम के एक Object की विभिन्न Properties के रूप में Fill कर देता है।
फिर इस $wp_query Object पर WordPress के “The Loop” API Functions का प्रयोग करके अथवा $wp_query Object के विभिन्न Methods का प्रयोग करके, User द्वारा Requested Resource से सम्बंधित विभिन्न मानों को Web Page के रूप में Format करते हुए User को Response Object के रूप में Return किया जाता है, जो कि इस $wp_query Object में Stored होते हैं।
फिर User का Web Browser, Response के रूप में आने वाले Response Object के Contents को Appropriate Formatting में Web Browser में Render करते हुए User की Resource Request को पूरा कर देता है।
WordPress में “The Loop” एक PHP Code होता है, जिसके विभिन्न Functions का प्रयोग करके WordPress Engine, Database पर Appropriate Query Fire करके विभिन्न Posts Retrieve करता है और Retrieved Posts को Frontend यानी Web Browser में Render करने के लिए Response के रूप में Send करता है।
Loop का प्रयोग करके WordPress हर Post को Current Page पर Display करता है और विभिन्न “The Loop” Tags के Criteria के आधार पर Post को Format कर देता है। जबकि “The Loop” में Specify किया गया कोई भी HTML या PHP Code, WordPress द्वारा हर Post पर Process किया जाता है।
“The Loop” के अन्दर हम विभिन्न Template Tags का प्रयोग करके विभिन्न प्रकार की Post Related Information को तो Display कर ही सकते हैं, साथ ही जब “The Loop” Run होता है, तब $post नाम का एक Global Variable भी Current Post की विभिन्न Values से Fill हो जाता है, जिसे Use करके हम Post Related विभिन्न प्रकार के Actions Perform कर सकते हैं। किसी भी “The Loop” का General Structure निम्नानुसार होता है:
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> <?php endwhile; else: ?> <p>Some error message or similar.</p> <?php endif; ?>
जब हम “The Loop” की बात करते हैं, तब मूल रूप से दो Functions ( have_posts() व the_post() ) को ही उपयोग में लिया जाता है और ये दोनों Functions वास्तव में $wp_query Object के Methods हैं, जो कि स्वयं WP_Query Class का Instant है।
have_posts() API Function
ये Function इस बात को Check करता है कि क्या Current WordPress Query द्वारा कोई भी Result Generate हो रहा है, जिस पर Looping किया जा सकता हो। चूंकि ये एक Boolean Function है, इसलिए यदि Current WordPress Query द्वारा एक भी Result Generate होता है, तो ये Function TRUE Return करता है अन्यथा FALSE Return करता है।
साथ ही यही Function Call होने के बाद Loop के अन्त में स्वयं ही rewind_posts() Function को Call करके Loop Pointer को फिर से Looping की शुरूआत में पहुंचा देता है। इसलिए यदि फिर से Looping Perform की जाए, तो Return होने वाले सभी Results में First Result से ही Looping शुरू होती है। इस Function का Syntax निम्नानुसार होता है:
<?php have_posts() ?>
जैसाकि हम देख सकते हैं कि ये Function कोई Argument Accept नहीं करता लेकिन True या False के रूप में हमेंशा एक Boolean Value Return करता है। इस Function को सामान्यत: हम निम्नानुसार अपनी Theme के किसी भी Template पर Use करके Database में Stored विभिन्न Posts को Display कर सकते हैं:
// File Name: wp-content/themes/bccfalna/index.php <?php if( have_posts() ){ echo "<h1>There are {$wp_query->found_posts} posts available to display.</h1>"; } ?>
जब हम इस Code को index.php Template में Specify करके http://localhost/wp/ URL को Web Browser में Load करते हैं, तो हमें निम्न चित्रानुसार Output प्राप्त होता है:

ऐसा Output हमें इसलिए प्राप्त होता है क्योंकि जैसे ही WordPress Request को पूरा करने के लिए index.php Web Page को Response के रूप में Create करता है, निम्न Code Execute होता है:
if( have_posts() ){
इस if Statement में Specified have_posts() API Function इस बात को Check करता है कि क्या WordPress Engine के User की Request को Process करते समय Execute की गई SQL Queries से Returned Results से $wp_query Object Filled है या नहीं।
चूंकि, किसी Request को पूरा करने के लिए WordPress Engine यदि $wp_query Object Create करता है, तो Database पर Fired Query से Returned Result से $wp_query Object Fill हो जाता है और इस Object की विभिन्न Properties के Filled होने की स्थिति में current_post Property में Current Post/Page का ID होता है, जबकि post_count Property में Current Web Page पर कुल Show हो सकने वाले Posts की संख्या होती है।
इसलिए have_posts() Function जब Execute होता है, तब इन्हीं दोनों Properties के आधार इस बात का निर्ण; करता है कि Current Web Page पर Render होने के लिए और Posts Available हैं या नहीं। यानी WordPress Core File query.php में have_posts() API Function को निम्नानुसार Define किया गया है:
// File Name: wp-includes/query.php function have_posts() { if ( $this->current_post + 1 < $this->post_count ) { return true; } elseif ( $this->current_post + 1 == $this->post_count && $this->post_count > 0 ) { do_action_ref_array('loop_end', array(&$this)); // Do some cleaning up after the loop $this->rewind_posts(); } $this->in_the_loop = false; return false; }
जब ये Function इस बात का पता लगाने के लिए Execute होता है कि क्या Current Web Page पर Render होने के लिए और Posts Exist हैं, और इस बात का पता लगाने के लिए निम्नानुसार have_posts() Function के if Statement को Execute करता है:
if ( $this->current_post + 1 < $this->post_count ) {
ये Statement WordPress Engine को इस बात का Instruction देता है कि यदि $wp_query Object की current_post Property में Stored Value का मान post_count Property में Stored मान से कम है, तो इसका मतलब है कि Current Web Page पर Execute होने के लिए अभी और Posts Exist हैं। इस स्थिति में ये Function निम्न Statement Execute करता है:
return true;
परिणामस्वरूप have_posts() Method true Return करता है, और WordPress Control if Statement Block में Enter करता है, जहां उसे Execute होने के लिए निम्नानुसार Statement प्राप्त होता है:
echo “<h1>There are {$wp_query->found_posts} posts available to display.</h1>“;
इस Statement के Execute होते ही $wp_query->found_posts Property में Stored कुल Posts की संख्या के साथ हमें उपरोक्त चित्रानुसार Output प्राप्त हो जाता है।
लेकिन यदि have_posts() Function का उपरोक्त if Statement false Return करता है, तो इसका मतलब यही है कि Current Page पर Render करने के लिए और Posts Exist नहीं है। इस स्थिति में if Statement के Fail होने पर निम्नानुसार elseif Statement Block Execute होता है:
} elseif ( $this->current_post + 1 == $this->post_count && $this->post_count > 0 ) {
ये Statement इस बात को Check करता है कि current_post+1 व post_count दोनों Properties में समान Values हैं या नहीं। और यदि इन दोनों में समान Values होने के साथ ही post_count का मान 0 से ज्यादा है, तो ये Statement इस बात का Signal होता है कि हमारा Loop अपने अन्तिम Post पर पहुंच चुका है। परिणामस्वरूप WordPress निम्न Statement Execute करते हुए “loop_end” Hook Fire करता है:
do_action_ref_array(‘loop_end‘, array(&$this));
और निम्नानुसार rewind_posts() Method को Execute करके Loop को फिर से शुरूआत में Set कर देता है:
$this->rewind_posts();
उपरोक्त दोनों Statements का Exaction करके WordPress elseif Statement Block से बाहर निकलता है, लेकिन अभी भी have_posts() Function के अन्दर ही होता है, जहां उसे Execute करने के लिए निम्न Statement मिलता है:
$this->in_the_loop = false;
in_the_loop Property में Stored true या false मान WordPress के लिए इस बात का Indication होता है कि Currently “The Loop” Active है या नहीं। यानी यदि इस Property में true मान Stored हो, तो ये मान WordPress को इस बात का Indication देता है कि अभी भी Current Page पर Render होने के लिए $wp_query Object में Posts Available हैं और Looping Continue रह सकता है।
लेकिन जब $wp_query Object में Current Page पर Render होने के लिए एक भी Post नहीं बचताए तब इस Property में false मान Set करके WordPress को इस बात का Instruction दिया जाता है कि अब इस Loop में फिर से Looping करने की जरूरत नहीं है, क्योंकि Current Page पर Render करने के लिए $wp_query Object में अब कोई Post Available नहीं है।
ये Statement $wp_query Object के in_the_loop Property को false मान Set करने के बाद निम्न Statement द्वारा false Return करता है:
return false;
यहां Return होने वाला false मान इसी बात का Signal है कि Current Page पर Render करने के लिए अब कोई भी Post Available नहीं है।
इस तरह से have_posts() Function का प्रयोग करके हम इस बात का पता लगाते हैं कि $wp_query Object में Currently कोई Post Render होने के लिए Exist है या नहीं
चूंकि have_posts() API Function वास्तव में $wp_query->query_posts() Method को ही Internally Call करता है, इसलिए यदि हम चाहें, तो उपरोक्त Code को निम्नानुसार भी लिख सकते हैं और इस Modified Code द्वारा भी हमें Exactly वही Output प्राप्त होगा, जो पिछले Code से प्राप्त हुआ था-
// File Name: wp-content/themes/bccfalna/index.php <?php if( $wp_query->have_posts() ){ echo "<h1>There are {$wp_query->found_posts} posts available to display.</h1>"; } ?>
the_post() API Function
ये API Function न तो कोई Argument Accept करता है न ही कोई Value Return करता है। लेकिन इस API Function का प्रयोग करके हम “The Loop” के दौरान Current Page/Post की विभिन्न Information को Access कर सकते हैं। इस Function को भी WordPress Core File query.php में Define किया गया है, जिसका Definition निम्नानुसार है-
// File Name: wp-includes/query.php function the_post() { global $post; $this->in_the_loop = true; if ( $this->current_post == -1 ) // loop has just started do_action_ref_array('loop_start', array(&$this)); $post = $this->next_post(); setup_postdata($post); }
जब ये Function Run होता है, तब ये Function वास्तव में निम्नानुसार विभिन्न काम करता है:
- सबसे पहले ये Function $post नाम का Global Variable Declare करता है, ताकि इस Function में $wp_query Object में Stored Current Post के Content का Pointer Available हो सके।
- $wp_query Object की in_the_loop Property को true Set करता है, जो कि WordPress Engine के लिए इस बात का Instruction होता है कि $wp_query Object में अभी और भी Posts हैं, जिन्हें Current Page पर Render किया जा सकता है।
- यदि “The Loop” की अभी शुरूआत ही हुई हो, तो ये Function “loop_start” नाम का एक Action Hook Fire करता है, जिसे जरूरत के अनुसार किसी Callback Function से Hooked किया जा सकता है।
- $post Global Variable में $wp_query Object में Stored Current Post/Page के Content के Pointer को Increment करके अगले Post/Page के Content का Pointer Set कर देता है। ताकि अगली बार जब “The Loop” Execute हो, तब Current Post के रूप में अगले Post का Content Available हो जाए और ऐसा करने के लिए Internally next_post() नाम के API Function को Call करता है।
- अन्त में setup_postdata() Function Call करके Current Page पर Current Post/Page को Display करने के लिए $post Variable को Setup करता है।
setup_postdata() API Function
ये Function Argument के रूप में Compulsory रूप से $post Object को Argument की तरह Accept करता है जबकि Return Value के रूप में हमेंशा true ही Return करता है।
// File Name: wp-includes/query.php function setup_postdata($post) { global $id, $authordata, $currentday, $currentmonth, $page, $pages, $multipage, $more, $numpages; $id = (int) $post->ID; $authordata = get_userdata($post->post_author); $currentday = mysql2date('d.m.y', $post->post_date, false); $currentmonth = mysql2date('m', $post->post_date, false); $numpages = 1; $page = get_query_var('page'); if ( !$page ) $page = 1; if ( is_single() || is_page() || is_feed() ) $more = 1; $content = $post->post_content; if ( strpos( $content, '<!--nextpage-->' ) ) { if ( $page > 1 ) $more = 1; $multipage = 1; $content = str_replace("\n<!--nextpage-->\n", '<!--nextpage-->', $content); $content = str_replace("\n<!--nextpage-->", '<!--nextpage-->', $content); $content = str_replace("<!--nextpage-->\n", '<!--nextpage-->', $content); $pages = explode('<!--nextpage-->', $content); $numpages = count($pages); } else { $pages = array( $post->post_content ); $multipage = 0; } do_action_ref_array('the_post', array(&$post)); return true; }
इस Function का मुख्य काम $post Object के आधार पर विभिन्न Global Variables को Setup करना होता है, ताकि उन्हें Current Page पर विभिन्न तरीकों से उपयोग में लिया जा सके और ऐसा करने के लिए विभिन्न प्रकार के API Functions का प्रयोग किया जाता है, जिनके बारे में हमें आने वाले Sections में जानेंगे।
इस Function को the_post() Function के अन्तिम Statement के रूप में Specify किया जाता है, इसलिए इस Function को सामान्यत: अलग से Call नहीं किया जाता।
साथ ही the_post() Function को Call करने का मूल उद्दे”; “The Loop” के लिए Nest Post/Page Data को Setup करना होता है, ताकि Loop के अगले Iteration में अगले Post के Data Available हो जाऐं।
लेकिन Current Post के Data तो WordPress Initialization Process के दौरान ही Available हो जाते हैं, जिन्हें WordPress Template Tags द्वारा Access किया जा सकता है और the_post() Function को Call करने पर ये Template Tags Automatically फिर से नए Post/Page की Values से Reset हो जाते हैं।
इस तरह से विभिन्न Template Tags के रूप में हमारे पास हमेंशा Current Post/Page से सम्बंधित विभिन्न Data Available रहते हैं, जिन्हें जरूरत के अनुसार उपयोग में लिया जा सकता है। साथ ही इस Function में जिन Global Variables को Declare किया गया है, उन्हें हम अपने किसी भी Template या Plugin में Directly Access कर सकते हैं।
जब setup_postdata() Function पूरी तरह से Execute हो जाता है, तब अन्त में “the_post” नाम का एक Action Hook Fire करता है। इस Hook के साथ यदि हम चाहें तो अपने किसी Callback Function को Execute होने के लिए Hooded कर सकते हैं।
do_action_ref_array(‘the_post‘, array(&$post));
जैसाकि हम देख सकते हैं कि “the_post” Hook को Fire करने के साथ ही दूसरे Argument के रूप में हमने & का प्रयोग करते हुए $post Object का Reference Pass किया है, इसलिए यदि हम “the_post” Action Hook के साथ किसी Callback Function को Attach करते हैं, तो उस Callback Function में Current Post Exist रहेगा, जिसे हम Directly Access कर सकते हैं।
यानी यदि हम चाहें हमारे Theme की functions.php File में निम्नानुसार इस Hook के साथ एक Callback Function को Hooked कर सकते हैं:
// File Name: wp-content/themes/bccfalna/functions.php add_action('the_post', 'postInfo'); function postInfo($p){ echo $p->post_content . '<br />'; }
अब यदि हमारी index.php File में लिखा गया Code निम्नानुसार हो:
// File Name: wp-content/themes/bccfalna/index.php <!DOCTYPE html> <html> <head> <title><?php bloginfo('name'); ?></title> </head> <body> <?php if(have_posts()){ while(have_posts()) the_post(); } ?> </body> </html>
तो http://localhost/wp/ URL को Specify करने पर हमें हमारा Output निम्नानुसार प्राप्त होता है:

जैसाकि उपरोक्त index.php File के PHP Code में हम देख सकते हैं कि हमने केवल “The Loop” Functions को Use किया है, जबकि the_post() Function स्वयं Current Post के Data को Display नहीं करता बल्कि अगले Post के Data को Use किए जाने हेतु Setup करता है। फिर भी हमें हमारे Web Page पर Output के रूप में विभिन्न Posts का Content दिखाई दे रहा है।
ऐसा इसलिए हो रहा है क्योंकि हमने “the_post” Hook के साथ postInfo() नाम का एक Callback Function Hooked किया है। परिणामस्वरूप जैसे ही index.php File में Specified the_post() Function Execute होता है, setup_postdata() Function Execute होता है, जो Internally निम्नानुसार Statement द्वारा “the_post” Hook Fire करता है:
do_action_ref_array(‘the_post‘, array(&$post));
और जैसाकि हम देख सकते हैं कि इस Hook को Fire करने के साथ ही दूसरे Argument की तरह एक Array Element के रूप में Global $post Object का Reference यानी Pointer भी Pass कर देता है।
परिणामस्वरूप जो भी Callback Function “the_post” Hook के साथ Hooded होता है, हर उस Callback Function में $post Object का Reference एक Parameter की तरह Pass हो जाता है।
इसीलिए हमने postInfo() नाम के functions.php File में Specify किए गए अपने Callback Function में $p Argument में Declare किया है, क्योंकि उपरोक्त Statement द्वारा Fire होने वाले “the_post” Hook के साथ दूसरे Argument के रूप में Specified $post Variable का Reference भी Return होता है, जो कि postInfo() Callback Function के Argument Acceptor के रूप में Specified $p Variable को Initialize हो जाता है।
परिणामस्वरूप हम $p Variable को Exactly $post Variable की तरह Use करने में सक्षम हो जाते हैं और postInfo() Function के अन्दर निम्न Statement द्वारा Current Post के Content को Render कर देते हैं:
echo $p->post_content . ‘<br />‘;
इस तरह से index.php File में हमने Current Post के Content को Render करने से सम्बंधित कोई Code नहीं लिखा है बल्कि “the_post” Hook का प्रयोग करते हुए, हमने Output में Render होने वाले Content को functions.php File में Specified Callback Function द्वारा निश्चित किया है।
यानी Output के रूप में User को क्या दिखाई देगा, इस बात को हम पूरी तरह से हमारी Theme के functions.php File द्वारा विभिन्न Hooks को Use करते हुए Control कर सकते हैं अथवा इसी Code को हम किसी Plugin Code के रूप में भी Define कर सकते हैं और Plugin द्वारा Output में दिखाई देने वाले Content को Control कर सकते हैं।
rewind_posts() API Function
ये भी एक काफी महत्वपूर्ण “The Loop” API Function है, जिसे Use करके हम Current Query द्वारा Selected सभी Posts/Pages की List की Beginning पर पहुंच जाते हैं, ताकि जरूरत पडने पर फिर से सभी Selected Posts/Pages की Looping कर सकें। WordPress Core File query.php में इस Function को निम्नानुसार Define किया गया है:
// File Name: /wp-includes/query.php function rewind_posts() { $this->current_post = -1; if ( $this->post_count > 0 ) { $this->post = $this->posts[0]; } }
जैसाकि इस Function के Code को देखकर हम समझ सकते हैं कि ये Function न तो कोई Argument Accept करता है न ही कोई Value Return करता है।
ये Function सबसे पहले $wp_query Object की current_post Property का मान -1 Set कर देता है, जो कि WordPress Engine के लिए इस बात का Signal होता है कि किसी भी Post को have_posts() या the_post() Function द्वारा Process नहीं किया गया है।
फिर ये Function if Statement द्वारा इस बात को Check करता है कि कुल जितने Posts, Current Page पर Render हो सकते हैं, उनकी संख्या 0 से ज्यादा है या नहीं। ये संख्या वही संख्या होती है, जिसे हम निम्न चित्रानुसार WordPress Dashboard => Settings => Reading Page पर निर्धारित करते हैं:

जैसाकि इस चित्र में हम देख सकते हैं कि कुल Render हो सकने वाले Posts की संख्या हमने 5 Set की है। इसलिए हमारे लिए post_count Property का मान भी 5 ही है।
यदि Current Page पर Render हो सकने वाले Posts की संख्या 0 से ज्यादा हो तो rewind_posts() Function में Specified if Condition true हो जाता है और WordPress Control इस if Statement Block के अन्दर Enter करता है, जहां उसे निम्नानुसार Statement प्राप्त होता है:
$this->post = $this->posts[0];
ये Statement Execute होकर $wp_query Object की posts Property, जो कि एक Array है, जिसमें $wp_query Object के सभी Posts, अलग-अलग Index Number पर Stored रहते हैं, में से Index Number 0 पर Stored Post को $wp_query Object की post Property में Assign कर दिया गया है, जो कि Current Loop का First Post यानी Currently Display होने वाला Post है।
इस तरह से rewind_posts() Method का प्रयोग करके हम Current Query द्वारा Returned सभी Posts की List में WordPress Pointer को First Post पर Rewind कर सकते हैं, ताकि जरूरत होने पर सभी Posts की Traversing शुरूआत से की जा सके।
next_post() API Function
इस API Function का प्रयोग करके हम Currently Fired Query द्वारा Generated Posts/Pages की List में Current Page/Post से Nest Page/Post पर Move कर सकते हैं। यानी Current $post Object की विभिन्न Properties को Next Page/Post की विभिन्न Properties से Fill कर सकते हैं।
// File Name: /wp-includes/query.php function next_post() { $this->current_post++; $this->post = $this->posts[$this->current_post]; return $this->post; }
जैसाकि इस API Function के Code द्वारा हम समझ सकते हैं कि सबसे पहले $wp_query Object की current_post Property को Increment किया गया है, जो कि Currently Display हो रहे Post की ID को Hold करता है। परिणामस्वरूप इस Property में Next Post का ID Store हो जाता है।
फिर निम्न Statement द्वारा $wp_query Object की post Property में अगले Post से सम्बंधित Information को Store कर दिया जाता है:
$this->post = $this->posts[$this->current_post];
अन्त में $wp_query Object की post Property में Stored Current Post की Information जो कि पिछले Statements के Execution के कारण अब वास्तव में Next Post की Information है, को Return कर दिया जाता है।
इस तरह से next_post API Function का प्रयोग करके हम Current Query द्वारा Generated Posts/Pages की List में Current Page/Post से अगले Page/Post पर Move कर सकते हैं।
ये Article इस वेबसाईट पर Selling हेतु उपलब्ध EBook Advance WordPress in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी है, तो निश्चित रूप से ये EBook भी आपके लिए काफी उपयोगी साबित होगी।
Advance WordPress in Hindi | Page: 835 | Format: PDF