WordPress Query String – Proper Handling

WordPress Query String – पिछले Discussion के अनुसार हम जानते हैं कि जब भी कोई Visitor WordPress Powered Page Load करता है, तो वह Page वास्तव में index.php पर ही Redirect होता है। उदाहरण के लिए जब हम निम्न URL Use करते हैं:

https://www.bccfalna.com/2011/03/hello-world/

तो वास्तव में ये URL निम्नानुसार तरीके से Internally निम्न URL पर Redirect होता है:

https://www.bccfalna.com/index.php?p=1

और ये URL, WordPress Database से Post ID 1 के लिए Data को Retrieve करता है। अब समझने वाली बात ये है कि किस प्रकार से URL Translation द्वारा MySQL Database पर कोई Query Fire होता है, जो Dynamically Post/Page Create करता है\

Query Process Overview

हमें ये समझना जरूरी होता है कि WordPress में कब और किस प्रकार से कोई Event Trigger होता है क्योंकि इससे हमें इस बात का पता चलता है हमारा Plugin इस Process में कहां पर अपना काम करना शुरू करता है। इसे हम निम्नानुसार Simple Step Flow द्वारा ज्यादा सरल तरीके से समझ सकते हैं:

  • कोई भी Frontend Request किए जाने पर सबसे पहले .htaccess File में Specified Rewrite Rule के आधार पर php File Load होती है जो कि wp-blog-header.php File को Load करता है।
  • फिर wp-blog-header.php File, wp-load.php File को Load करता है जो कि php File को Search करके Include करता है और ये wp-config.php File Run होते ही wp-settings.php File को Include करता है, जो कि Function File, Active Plugins व अन्त में Pluggable Functions को Include करता है।
  • Request को Fulfill करने के लिए इस WordPress Initialization Process के दौरान $wp_query$wp_rewrite नाम के दो Global Objects Instantiate होते हैं।
  • फिर कुछ और Files जैसे कि Translation Files व हमारे Theme की Functions File Load होती है। यहां तक में WordPress पूरी तरह से Load हो चुका होता है व विभिन्न Active Plugins आपस में Interaction करने के लिए पूरी तरह से तैयार होते हैं, लेकिन इन्हें अभी तक इस बात का पता नहीं होता कि क्‍या Display करना है और किस Page के लिए Request Perform किया गया है।
  • सभी जरूरी Files के Load होने के बाद wp-blog-header.php File, wp() Function को Call करता है, जो कि WP::parse_request() Function को Execute करता है। यही वह Function होता है जो हर उस जरूरत को पूरा करता है जो WordPress के लिए किसी Page Request को समझने हेतु जरूरी होता है।
  • यही Function सभी Registered Rewrite Rules को Fetch करता है और जैसाकि हमने mod_rewrite Section में Discuss किया, इसमें pattern => replacement Pairs की List Contained होती है, जो WordPress को इस बात का Instruction देता है कि /category/turorials/page/3/ URL का मतलब वास्तव में /index.php?category_name= tutorials&paged=3 है।
  • ये Function हर Rewrite Rule पर जाता है, उसे Requested URL से Compare करता है और एक Match Find करने की कोशिश करता है। यदि कोई Match प्राप्त नहीं होताए तो ये Function 404 Error Return करता है।
  • WordPress Initialization Process के इस Point तक यदि 404 Error Generate न हो, तो WordPress के पास अब एक Permalink Translation Pattern होता है, जिसमें Query Variable Placeholders होते हैं। जैसे /index.php?category_name=<string> &paged=<number>, जिसे अब इन Query Variable के Values की जरूरत होती है।
  • अब parse_request() Method सभी Registered Query Variables की List Obtain करता है और हर Variable के लिए इस बात को Check करता है कि क्‍या उसके लिए किसी Value को Permalink Pattern द्वारा GET या POST Submission के माध्‍यम से कोई Value Set किया गया है या नहीं।
  • WordPress Initialization Process के इस Point तक WordPress के पास URL Request को एक Proper MySQL Database Query Fire करने, Post Data को प्राप्त करने, Required Theme Template को Load करने व Requested Page को Display करने से सम्बंधित सारी जानकारियां होती हैं।

उपरोक्त Discussion में हमने “Registered Rewrite Rules” व “Registered Query Variable” जैसे दो Concepts का जिक्र किया है। जो इस बात का Indication है कि यदि इन्हें WordPress Initialization Process के दौरान कहीं पर Registered किया गया होता है, तो Plugin द्वारा इन्हें किसी न किसी तरह से Modify भी किया जा सकता है और अब हम इसी विषय को समझेंगे।

The rewrite Object

जब हम Rewrite API के साथ Deal कर रहे होते हैं, तब $wp_rewrite Object वह सबसे पहला Object होता है, जिसे हमें समझना होता है। इसके Content की जानकारी प्राप्त करने के लिए हम print_r($wp_rewrite) Statement Use कर सकते हैं, जो हमें इस Object से सम्बंधित निम्नानुसार Information Return करता है:

WP_Rewrite Object
(
    [permalink_structure] => /%postname%/
    [use_trailing_slashes] => 1
    [author_base] => author
    [search_base] => search
    [comments_base] => comments
    [pagination_base] => page
    [feed_base] => feed
    [comments_feed_structure] => 
    [front] => /
    [root] => 
    [index] => index.php
    [matches] => 
    [rules] => Array
        (
            [category/(.+?)/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?category_name=$matches[1]&feed=$matches[2]
            [category/(.+?)/(feed|rdf|rss|rss2|atom)/?$] => index.php?category_name=$matches[1]&feed=$matches[2]
            [category/(.+?)/page/?([0-9]{1,})/?$] => index.php?category_name=$matches[1]&paged=$matches[2]
            [category/(.+?)/?$] => index.php?category_name=$matches[1]
            [tag/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?tag=$matches[1]&feed=$matches[2]
            [tag/([^/]+)/(feed|rdf|rss|rss2|atom)/?$] => index.php?tag=$matches[1]&feed=$matches[2]
            [tag/([^/]+)/page/?([0-9]{1,})/?$] => index.php?tag=$matches[1]&paged=$matches[2]
            [tag/([^/]+)/?$] => index.php?tag=$matches[1]
            [type/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?post_format=$matches[1]&feed=$matches[2]
            [type/([^/]+)/(feed|rdf|rss|rss2|atom)/?$] => index.php?post_format=$matches[1]&feed=$matches[2]
            [type/([^/]+)/page/?([0-9]{1,})/?$] => index.php?post_format=$matches[1]&paged=$matches[2]
            [type/([^/]+)/?$] => index.php?post_format=$matches[1]
            [.*wp-(atom|rdf|rss|rss2|feed|commentsrss2)\.php$] => index.php?feed=old
            [.*wp-app\.php(/.*)?$] => index.php?error=403
            [.*wp-register.php$] => index.php?register=true
            [feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?&feed=$matches[1]
            [(feed|rdf|rss|rss2|atom)/?$] => index.php?&feed=$matches[1]
            [page/?([0-9]{1,})/?$] => index.php?&paged=$matches[1]
            [comments/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?&feed=$matches[1]&withcomments=1
            [comments/(feed|rdf|rss|rss2|atom)/?$] => index.php?&feed=$matches[1]&withcomments=1
            [search/(.+)/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?s=$matches[1]&feed=$matches[2]
            [search/(.+)/(feed|rdf|rss|rss2|atom)/?$] => index.php?s=$matches[1]&feed=$matches[2]
            [search/(.+)/page/?([0-9]{1,})/?$] => index.php?s=$matches[1]&paged=$matches[2]
            [search/(.+)/?$] => index.php?s=$matches[1]
            [author/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?author_name=$matches[1]&feed=$matches[2]
            [author/([^/]+)/(feed|rdf|rss|rss2|atom)/?$] => index.php?author_name=$matches[1]&feed=$matches[2]
            [author/([^/]+)/page/?([0-9]{1,})/?$] => index.php?author_name=$matches[1]&paged=$matches[2]
            [author/([^/]+)/?$] => index.php?author_name=$matches[1]
            [([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&feed=$matches[4]
            [([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/(feed|rdf|rss|rss2|atom)/?$] => index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&feed=$matches[4]
            [([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/page/?([0-9]{1,})/?$] => index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&paged=$matches[4]
            [([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/?$] => index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]
            [([0-9]{4})/([0-9]{1,2})/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?year=$matches[1]&monthnum=$matches[2]&feed=$matches[3]
            [([0-9]{4})/([0-9]{1,2})/(feed|rdf|rss|rss2|atom)/?$] => index.php?year=$matches[1]&monthnum=$matches[2]&feed=$matches[3]
            [([0-9]{4})/([0-9]{1,2})/page/?([0-9]{1,})/?$] => index.php?year=$matches[1]&monthnum=$matches[2]&paged=$matches[3]
            [([0-9]{4})/([0-9]{1,2})/?$] => index.php?year=$matches[1]&monthnum=$matches[2]
            [([0-9]{4})/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?year=$matches[1]&feed=$matches[2]
            [([0-9]{4})/(feed|rdf|rss|rss2|atom)/?$] => index.php?year=$matches[1]&feed=$matches[2]
            [([0-9]{4})/page/?([0-9]{1,})/?$] => index.php?year=$matches[1]&paged=$matches[2]
            [([0-9]{4})/?$] => index.php?year=$matches[1]
            [.?.+?/attachment/([^/]+)/?$] => index.php?attachment=$matches[1]
            [.?.+?/attachment/([^/]+)/trackback/?$] => index.php?attachment=$matches[1]&tb=1
            [.?.+?/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?attachment=$matches[1]&feed=$matches[2]
            [.?.+?/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$] => index.php?attachment=$matches[1]&feed=$matches[2]
            [.?.+?/attachment/([^/]+)/comment-page-([0-9]{1,})/?$] => index.php?attachment=$matches[1]&cpage=$matches[2]
            [(.?.+?)/trackback/?$] => index.php?pagename=$matches[1]&tb=1
            [(.?.+?)/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?pagename=$matches[1]&feed=$matches[2]
            [(.?.+?)/(feed|rdf|rss|rss2|atom)/?$] => index.php?pagename=$matches[1]&feed=$matches[2]
            [(.?.+?)/page/?([0-9]{1,})/?$] => index.php?pagename=$matches[1]&paged=$matches[2]
            [(.?.+?)/comment-page-([0-9]{1,})/?$] => index.php?pagename=$matches[1]&cpage=$matches[2]
            [(.?.+?)(/[0-9]+)?/?$] => index.php?pagename=$matches[1]&page=$matches[2]
            [[^/]+/attachment/([^/]+)/?$] => index.php?attachment=$matches[1]
            [[^/]+/attachment/([^/]+)/trackback/?$] => index.php?attachment=$matches[1]&tb=1
            [[^/]+/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?attachment=$matches[1]&feed=$matches[2]
            [[^/]+/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$] => index.php?attachment=$matches[1]&feed=$matches[2]
            [[^/]+/attachment/([^/]+)/comment-page-([0-9]{1,})/?$] => index.php?attachment=$matches[1]&cpage=$matches[2]
            [([^/]+)/trackback/?$] => index.php?name=$matches[1]&tb=1
            [([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?name=$matches[1]&feed=$matches[2]
            [([^/]+)/(feed|rdf|rss|rss2|atom)/?$] => index.php?name=$matches[1]&feed=$matches[2]
            [([^/]+)/page/?([0-9]{1,})/?$] => index.php?name=$matches[1]&paged=$matches[2]
            [([^/]+)/comment-page-([0-9]{1,})/?$] => index.php?name=$matches[1]&cpage=$matches[2]
            [([^/]+)(/[0-9]+)?/?$] => index.php?name=$matches[1]&page=$matches[2]
            [[^/]+/([^/]+)/?$] => index.php?attachment=$matches[1]
            [[^/]+/([^/]+)/trackback/?$] => index.php?attachment=$matches[1]&tb=1
            [[^/]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?attachment=$matches[1]&feed=$matches[2]
            [[^/]+/([^/]+)/(feed|rdf|rss|rss2|atom)/?$] => index.php?attachment=$matches[1]&feed=$matches[2]
            [[^/]+/([^/]+)/comment-page-([0-9]{1,})/?$] => index.php?attachment=$matches[1]&cpage=$matches[2]
        )

    [extra_rules] => Array ( )

    [extra_rules_top] => Array ( )

    [non_wp_rules] => Array ( )

    [extra_permastructs] => Array (
            [category] => Array (
                    [with_front] => 1
                    [ep_mask] => 512
                    [paged] => 1
                    [feed] => 1
                    [forcomments] => 
                    [walk_dirs] => 1
                    [endpoints] => 1
                    [struct] => /category/%category%
                )

            [post_tag] => Array (
                    [with_front] => 1
                    [ep_mask] => 1024
                    [paged] => 1
                    [feed] => 1
                    [forcomments] => 
                    [walk_dirs] => 1
                    [endpoints] => 1
                    [struct] => /tag/%post_tag%
                )

            [post_format] => Array (
                    [with_front] => 1
                    [ep_mask] => 0
                    [paged] => 1
                    [feed] => 1
                    [forcomments] => 
                    [walk_dirs] => 1
                    [endpoints] => 1
                    [struct] => /type/%post_format%
                )

        )

    [endpoints] => Array ( )

    [use_verbose_rules] => 
    [use_verbose_page_rules] => 1
    [rewritecode] => Array (
            [0] => %year%
            [1] => %monthnum%
            [2] => %day%
            [3] => %hour%
            [4] => %minute%
            [5] => %second%
            [6] => %postname%
            [7] => %post_id%
            [8] => %author%
            [9] => %pagename%
            [10] => %search%
            [11] => %category%
            [12] => %post_tag%
            [13] => %post_format%
        )

    [rewritereplace] => Array (
            [0] => ([0-9]{4})
            [1] => ([0-9]{1,2})
            [2] => ([0-9]{1,2})
            [3] => ([0-9]{1,2})
            [4] => ([0-9]{1,2})
            [5] => ([0-9]{1,2})
            [6] => ([^/]+)
            [7] => ([0-9]+)
            [8] => ([^/]+)
            [9] => ([^/]+?)
            [10] => (.+)
            [11] => (.+?)
            [12] => ([^/]+)
            [13] => ([^/]+)
        )

    [queryreplace] => Array (
            [0] => year=
            [1] => monthnum=
            [2] => day=
            [3] => hour=
            [4] => minute=
            [5] => second=
            [6] => name=
            [7] => p=
            [8] => author_name=
            [9] => pagename=
            [10] => s=
            [11] => category_name=
            [12] => tag=
            [13] => post_format=
        )

    [feeds] => Array (
            [0] => feed
            [1] => rdf
            [2] => rss
            [3] => rss2
            [4] => atom
        )

    [feed_structure] => feed/%feed%
    [comment_feed_structure] => comments/feed/%feed%
    [author_structure] => /author/%author%
)

इस Object का [Rules] नाम का जो Array होता है, वही हमारे WordPress के साथ Registered विभिन्न Rewrite Rules को Represent करता है। जबकि $rewrite Object में हमारी Current WordPress Site/Blog के Permalink Structure से सम्बंधित विभिन्न Information Contained होती हैं।

The query Object

जैसाकि पिछले Section में हमने $wp_rewrite Object के Data को देखा उसी तरह से print_r($wp_query) Object के Data को भी हम Display कर सकते हैं। इसी Object में विभिन्न Registered Query Variables की List होती है, जिससे Rewrite Rules Match होता है और Query Variables से सम्बंधित उन विभिन्न Information को Collect करता है, जिनकी जरूरत Initial Page Request को MySQL Query में Translate करने के लिए होती है।

WordPress के Rewrite API Functions का प्रयोग करके हम $wp_rewrite$wp_query Objects के Rewrite URLs व Query Variables को Modify कर सकते हैं। परिणामस्वरूप हमारे द्वारा Specified Rewrite URLs व Query Variables के आधार पर WordPress किसी Special Type की Requirement को पूरा करने में सक्षम हो सकता है।

इस API के Function का प्रयोग करके हम हमारे स्वयं के Rewire Rules Create कर सकते हैं और इस बात को तय कर सकते हैं कि WordPress उन्हें किस प्रकार से Interpret करेगा। इसी प्रकार से इस API का प्रयोग करके हम एक Consistent URL Pattern व Site Layout को Defined रखते हुए WordPress Site को Non-WordPress Pages के साथ Integrate कर सकते है। यानी कई Special Requirements को पूरा करने के लिए भी इस API को प्रयोग कर सकते हैं।

Creating Rewrite Rule

WordPress हमें date_rewrite_rule() नाम का API Function Provide करता है, जो दो Parameters Accept करता है। ये API Function mod_rewrite के सामान ही काम करता है, जो पहले Parameter के रूप में एक URL Pattern Accept करता है, जिसे Match किया जाना होता है। जबकि दूसरे Parameter के रूप में Match होने वाले URL के स्थान पर Replace किए जाने वाले URL को Accept करता है इसे हम कुछ निम्नानुसार तरीके से Use कर सकते हैं:

// Add rules
add_action( 'init', 'add_custom_rules' );
function add_custom_rules() {
	add_rewrite_rule(
		'ebooks/?([^/]*)',
		'index.php?pagename=ebooks&ebook_id=$matches[1]', 
		'top' 
	);
}

Add किए गए इस Rewrite Rule के अनुसार WordPress Internally सभी ebooks/something/ URLs को ebooks Page पर Send कर देता है, जिसके साथ ebook_id नाम का एक Additional Parameter भी होता है। इस Example Code में हमने “top” नाम का एक Additional Parameter भी Pass किया है, जो इस बात को Specify करता है कि सभी Rewrite Rules से पहले ये Rule Add होगा, ताकि Built-In Rules के पहले इस Rule से Matching हो।

Registering Query Variable

जब हम पिछले Section के Code द्वारा किसी Rewrite Rule को $wp_rewrite Object में Add कर देते हैं, उसके बाद उस Rule में Add किए गए हर Query Variable को हमें $wp_query Object में Add करना होता है। पिछले Code में हमने ebook_id नाम के एक Query Variable को Rule के साथ Specify किया है। इसलिए इस Query Variable को $wp_query Object में Register करने के लिए हमें निम्नानुसार Code लिखना जरूरी होता है:

// Add the ebook_id var so that WP recognizes it
add_filter( 'query_vars', 'add_query_var' );
function add_query_var( $vars ) {
	$vars[] = 'ebook_id';
	return $vars;
}

इस प्रकार से पिछले Section के अनुसार नए Rewrite Rule को $wp_rewrite Object में तथा इस Section के अनुसार Rewrite Rule में Use किए गए विभिन्न Query Variables को $wp_query Object में Add कर देने मात्र से ही हमारा Custom Redirection का काम पूर्ण हो जाता है। यानी Redirection के लिए हमें और कुछ करने की जरूरत नहीं होती। केवल उपरोक्तानुसार इन Objects को Modify करना ही WordPress URL Rewrite करने के लिए पर्याप्त है।

Flushing Rewrite Rules

WordPress Rewrite Rules के साथ Trick ये है कि जब इन्हें Modify (Add, Update, Delete) किया जाता है, जब हमें WordPress को इस बात का Instruction देना जरूरी होता है कि वह सभी Rewire Rules की अपनी List को Rebuild करते हुए Refresh करे। ऐसा करने के लिए या तो हमें WordPress के Permalink Options Page को Visit करना होता है या फिर हम flush_rewrite_rules() API Function को Use करते हैं और हम ये काम किसी Plugin के Activation या Deactivation के दौरान निम्नानुसार कर सकते हैं:

// Add the rewrite rule and flush on plugin activation
register_activation_hook( __FILE__, 'onactivation' );
function onactivation() {
	add_rules();
	flush_rewrite_rules();
}

// Flush when deactivated
register_deactivation_hook( __FILE__, 'ondeactivation' );
function ondeactivation() {
	flush_rewrite_rules();
}

जब हम नया Rewrite Rule Add करते हैं, तब उपरोक्तानुसार तरीके से Plugin Activation के समय ही इसे Add किया जाना चाहिए तथा साथ ही flush_rewrite_rules() API Function का प्रयोग करके Rewrite List को Rebuild भी करना चाहिए, ताकि WordPress System नए Rewrite Rule से अवगत हो जाए।

init” के दौरान भी Rewrite Rule को Add करना चाहिए, क्योंकि हो सकता है कि किसी अन्‍य Plugin द्वारा भी Activation के दौरान ही किसी अन्‍य Rules को Flush किया जा रहा हो। लेकिन हर Page Request के साथ Rules को Flush नहीं करना चाहिए। यानी हमें कभी भी “init” Hook के साथ Attached Callback Function में Rules को Flush नहीं करना चाहिए।

जबकि Plugin Deactivation के दौरान ही उस Plugin द्वारा Add किए गए Rewrite Rules को Clear करते हुए फिर से Flush करना चाहिए, तो कि WordPress की Rewrite Rules की List फिर से Rebuild हो जाए।

WordPress in Hindi - BccFalna.comये Article इस वेबसाईट पर Selling हेतु उपलब्‍ध EBook Advance WordPress in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी है, तो निश्चित रूप से ये EBook भी आपके लिए काफी उपयोगी साबित होगी।

Advance WordPress in Hindi | Page: 835 | Format: PDF

BUY NOW GET DEMO REVIEWS