Add_rewrite_rule के साथ मदद चाहिए


55

उपाय


मैं अपडेट 3 के साथ गया हूं और इसे काम कर रहा हूं। मैं क्या गलत समझा था, मुझे विश्वास था कि रीराइट नियम बदल जाएगा था designers/?designer=some-designer&bid=9करने के लिए /designers/some-designer। लेकिन यह निश्चित रूप से चारों ओर का रास्ता है।


मैं कुछ शोध कर रहा हूं, लेकिन मुझे add_rewrite_rule () का उपयोग करने का तरीका नहीं मिला ।

यह पोस्ट मेरे लिए बहुत जरूरी है, लेकिन क्या मुझे वास्तव में इतना कोड चाहिए?

मेरी वर्तमान लिंक यह है:
http://www.nor_1fashion.no/designers/?designer=Batlak-og-Selvig&bid=9
मुझे क्या चाहिए यह
http://www.norp3fashion.no/designers-Batlak-og-Selvig /

  1. मैं कैसे उपयोग add_rewrite_rule()करूं?
  2. मुझे डिजाइनर आईडी (बोली) पास करनी होगी। URL में दिखाने के साथ re.write नियमों का उपयोग करते समय मैं यह कैसे कर सकता हूं?

अपडेट १

मैंने यह पाया जो थोड़ा अधिक व्याख्यात्मक है। लेकिन यह काम नहीं कर रहा है:

function add_rewrite_rules( $wp_rewrite ) 
{
    $new_rules = array(
        '('.$template_page_name.')/designers/(.*?)/?([0-9]{1,})/?$' => 'designers.php?designer='.
        $wp_rewrite->preg_index(1).'&bid='.
        $wp_rewrite->preg_index(2)
    );
       // Always add your rules to the top, to make sure your rules have priority
    $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}
add_action('generate_rewrite_rules', 'add_rewrite_rules');

function query_vars($public_query_vars) {

    $public_query_vars[] = "designer";
    $public_query_vars[] = "bid";
    return $public_query_vars;
}
add_filter('query_vars', 'query_vars')

अपडेट २

यहाँ एक और समाधान मैंने कोशिश की है, कि जन फैब्री एक और सूत्र में सुझाते हैं । मैंने इसे अपने कार्यों में लगा दिया। एफपी, लेकिन इसका कोई प्रभाव नहीं है।

add_action('generate_rewrite_rules', 'add_rewrite_rules');
add_filter('query_vars', 'query_vars');

/* Custom re-write rules for desigenrs
------------------------------------------------------------------------------*/
function add_rewrite_rules( $wp_rewrite ) 
{
    add_rewrite_rule('^designers/([^/]*)/([^/]*)$ /designers/?designer=$1&bid=$2 [L]', 'top');
    flush_rewrite_rules(false);
}


function query_vars($public_query_vars) {

    $public_query_vars[] = "designer";
    $public_query_vars[] = "bid";
    return $public_query_vars;
}

अपडेट 3
मुझे यहां कुछ उदाहरण भी मिले। लेकिन यह भी काम नहीं कर रहा है :(

add_filter('rewrite_rules_array','wp_insertMyRewriteRules');
add_filter('query_vars','wp_insertMyRewriteQueryVars');
add_filter('init','flushRules');  

// Remember to flush_rules() when adding rules
function flushRules(){
    global $wp_rewrite;
    $wp_rewrite->flush_rules();
}

// Adding a new rule
function wp_insertMyRewriteRules($rules)
{
    $newrules = array();
    $newrules['(designers)/(\d*)$'] = 'index.php?pagename=designers&designer=$matches[1]';
    return $newrules + $rules;
}

// Adding the bid var so that WP recognizes it
function wp_insertMyRewriteQueryVars($vars)
{
    array_push($vars, 'designer');
    return $vars;
}

अद्यतन 4 मैंने भी इस समाधान की कोशिश की, लेकिन अभी भी कोई सक्सेज नहीं है।

add_filter('search_rewrite_rules', 'designers_createRewriteRules');

function designers_createRewriteRules($rewrite) {
global $wp_rewrite;

// add rewrite tokens
$designer_token = '%designers%';
$wp_rewrite->add_rewrite_tag($designer_token, '(.+)', 'designers=');

$bid_token = '%bid%';
$wp_rewrite->add_rewrite_tag($bid_token, '(.+)', 'bid=');

$keywords_structure = $wp_rewrite->root . "designers/$designer_token/$bid_token";
$keywords_rewrite = $wp_rewrite->generate_rewrite_rules($keywords_structure);

return ( $rewrite + $keywords_rewrite );

}

अद्यतन 5
ऐसा लगता है कि मेरे पुनर्लेखन नियम नहीं जोड़े गए हैं। Follwoing afte radding नए नियमों को निष्पादित करना:, print_r($wp_rewrite)मेरे नए पुनर्लेखन नियमों को शामिल नहीं करता है।

अद्यतन 6
मैंने जनवरी के समाधान का परीक्षण किया। लेकिन URL नहीं बदलता :(

/* Initiation script for NF template
------------------------------------------------------------------------------*/   
add_action('after_setup_theme','norwegianfashion_setup');

if ( ! function_exists( 'norwegianfashion_setup' ) ):

  function norwegianfashion_setup() { 
    /* Here I do a lot of stuff */

    // SEO friendly URL for desigenrs
    add_action( 'init', 'wpa5413_init' );
    add_filter( 'query_vars', 'wpa5413_query_vars' );
  }

endif;


/* Custom re-write rules for desigenrs
------------------------------------------------------------------------------*/
function wpa5413_init()
{
    // Remember to flush the rules once manually after you added this code!
    add_rewrite_rule(
        'designers/([^/]+)/?',
        'index.php?pagename=designers&designer=$matches[1]',
        'top' );
}

function wpa5413_query_vars( $query_vars )
{
    $query_vars[] = 'designer';
    return $query_vars;
}

अगर कोई मुझे इस मुद्दे को सुलझाने में मदद करने में सक्षम था, तो मैं वास्तव में इसकी सराहना करूंगा ।


यह आपके द्वारा यहां पूछे गए पहले प्रश्न के समान है, और जिसके लिए मैंने एक उत्तर दिया था । क्या तब से स्थिति बदल गई है, इसलिए मेरा जवाब अब मान्य नहीं है? यदि आप अपने URL में डिज़ाइनर आईडी नहीं चाहते हैं, तो आपको "स्लग" को आईडी में बदलना होगा, वर्डप्रेस आपके लिए ऐसा नहीं कर सकता। क्या डिजाइनर अभी भी एक बाहरी वस्तु हैं?
Jan Fabry

@Jan Fabry हाँ, मुझे पता चला कि मैंने यह पोस्ट करने के बाद (मैं भूल गया)। अब मैं आपको बेहतर सुझाव देता हूं। मेरा अपडेटेड कोड यहां देखें। मेरे डिजाइनर अभी भी एक कस्टम DB में प्रविष्टियां हैं। क्या साथ में गुजरने के लिए POST इंस्टीड जीईटी का उपयोग करना संभव है bid?
स्टीवन

अगर मैं लिंक को कॉपी करता हूं और किसी और को भेजता हूं तो POST रिक्वेस्ट का इस्तेमाल करने से कोई फर्क नहीं पड़ेगा। क्या यह स्लग को अद्वितीय बनाने और वहां से डेटा देखने की समस्या है?
Jan Fabry

@ जान फेब्री: आपका क्या मतलब है slug? `डिजाइनर डेटा को पुनःप्राप्त करने के bidबजाय उपयोग करना बहुत आसान हैdesigner
स्टीवन

जवाबों:


87

नियमों को फिर से लिखने पर कुछ पृष्ठभूमि

WP रीराइट सिस्टम जटिल दिखता है, लेकिन वास्तव में यह समझना मुश्किल नहीं है कि यह कैसे काम करता है। यह सुंदर URL ( /designers/) को पार्स करने के लिए उपयोग किया जाता है जैसे कि वे गैर-सुंदर ( /index.php?pagename=designers) थे। मूल विचार यह है कि आपके पास फिर से लिखने के नियमों की एक सूची है , नियमित अभिव्यक्तियाँ जो आने वाले URL से मेल खा सकती हैं, और उन्हें अन्य URL में फिर से लिखती हैं, अधिकतर index.phpकुछ क्वेरी चर के रूप में। ये चर URL से मेल खाने वाली नियमित अभिव्यक्ति के कुछ हिस्सों पर सेट होते हैं। नियमों का ऊपर से नीचे तक मूल्यांकन किया जाता है, इसलिए यदि दो नियम मेल खाते हैं, तो पहला "जीत" होगा।

ये पुनर्लेखन नियम कॉल करके डेटाबेस में संग्रहीत किए जाते हैं flush_rewrite_rules(), लेकिन क्योंकि इन नियमों को बनाना और लिखना एक महंगा ऑपरेशन है, आपको इसे हर पर नहीं करना चाहिए init। इसके बजाय, आप इसे केवल तभी करते हैं जब आप नियमों को बदलते हैं: शायद प्लगइन सक्रियण (उपयोग करके register_activation_hook()), या मैन्युअल रूप से Permalinks सेटिंग्स पृष्ठ पर जाकर ( क्योंकि विषय सक्रियण पर यह स्वचालित रूप से ऐसा करना कठिन है )। यदि आप नियमों को फ्लश नहीं करते हैं, तो कॉलिंग add_rewrite_rule()का कोई प्रभाव नहीं है। यह कॉल करने के लिए कोई समस्या नहीं है add_rewrite_rule()कि हर पर init, के बाद भी आप नियमों प्लावित।

अपने रीराइट नियमों को जोड़ने के कई तरीके हैं, और यदि आप केवल एक नियम जोड़ना चाहते हैं, तो आप ऐसा कर सकते हैं add_rewrite_rule()। क्योंकि पद, पृष्ठ, वर्गीकरण, ... कई नियमों के परिणामस्वरूप, वे उच्च स्तर के कार्यों के साथ बनाए जाते हैं add_rewrite_tag(), जैसे add_permastruct()..., लेकिन हमारे यहां जो साधारण मामले हैं, उनके लिए ये आवश्यक नहीं हैं।

कुछ फ़िल्टर भी हैं, इसलिए आप हुक generate_rewrite_rulesया generate_rewrite_rules_arrayहुक का उपयोग करके अपने नियमों को भी जोड़ सकते हैं । ये आपको पूर्ण नियमों पर बहुत विस्तृत नियंत्रण प्रदान करते हैं, लेकिन add_rewrite_rule()यदि आप केवल एक नियम जोड़ना चाहते हैं , तो यह पर्याप्त है।

मैंने एक छोटा सा प्लगइन बनाया जो आपको वर्तमान पुनर्लेखन नियमों का विश्लेषण करने की अनुमति देता है , और (निश्चित रूप से) मैं आपको सलाह देता हूं कि जब आप कुछ भी बदलने की कोशिश करते हैं तो आप इसका उपयोग करते हैं।

URL से आपकी अतिरिक्त जानकारी प्राप्त करना

चलिए आपके द्वारा दिए गए उदाहरण पर निर्माण करते हैं। आपके पास डिज़ाइनर ब्रांड है Batlak og Selvig, जिसमें नम्बर ID ( bid) है 9। आप URL में यह आईडी नहीं चाहते हैं, लेकिन केवल नाम है। हम (रिक्ति या विशेष वर्ण के बिना) नाम का URL के अनुकूल संस्करण फोन स्लग : Batlak-og-Selvig

सामान्य तौर पर, URL में पृष्ठ पर दिखाई जाने वाली सामग्री को पहचानने के लिए सभी जानकारी होनी चाहिए। आप जिस वास्तविक डिज़ाइनर आईडी को प्रदर्शित करना चाहते हैं, उसे स्टोर करने के लिए आप कुकीज या POST अनुरोधों का उपयोग कर सकते हैं, लेकिन यदि कोई लिंक को साझा करता है, तो उसे मेल, फ़ेसबुक, ट्विटर के माध्यम से भेजकर या फ़ोन पर ज़ोर से पढ़कर यह टूट जाएगा। यदि आप अपने URL में संख्यात्मक आईडी का उपयोग नहीं करना चाहते हैं, तो आपको यह सुनिश्चित करना चाहिए कि स्लग अद्वितीय है: तो आप सबसे पहले स्लग के आधार पर आईडी की खोज करते हैं, और जैसा आपने पहले किया था वैसा ही जारी रखें।

तो क्या अब हम सीख लिया है कि हम पैटर्न के लिए रीराइट नियम जोड़ना चाहते है " /designers/अगले करने के लिए कुछ भी द्वारा पीछा किया /" , और बचाने के लिए है कि "कुछ भी" में designer_slugक्वेरी चर। आपके मामले में मेरा मानना ​​है कि आप भी पृष्ठ designersको सामान्य पृष्ठ सामग्री के रूप में स्लग के साथ उपयोग करना चाहते हैं , इसलिए हम वर्डप्रेस को भी बताएंगे।

add_action( 'init', 'wpa5413_init' );
function wpa5413_init()
{
    // Remember to flush the rules once manually after you added this code!
    add_rewrite_rule(
        // The regex to match the incoming URL
        'designers/([^/]+)/?',
        // The resulting internal URL: `index.php` because we still use WordPress
        // `pagename` because we use this WordPress page
        // `designer_slug` because we assign the first captured regex part to this variable
        'index.php?pagename=designers&designer_slug=$matches[1]',
        // This is a rather specific URL, so we add it to the top of the list
        // Otherwise, the "catch-all" rules at the bottom (for pages and attachments) will "win"
        'top' );
}

केवल एक चीज बची है, वर्डप्रेस को designer_slugक्वेरी चर में रखने के लिए बताने के लिए , ताकि आप इसे बाद में एक्सेस कर सकें। वर्डप्रेस क्वेरी वेरिएबल्स के एक श्वेतसूची का उपयोग करता है, ताकि लोगों को यूआरएल के माध्यम से पोस्ट क्वेरी के हर पैरामीटर को संशोधित करने से रोका जा सके। इस सूची में सब कुछ अनदेखा नहीं है। बस हुक में query_varsहुक और अपने अतिरिक्त चर जोड़ें:

add_filter( 'query_vars', 'wpa5413_query_vars' );
function wpa5413_query_vars( $query_vars )
{
    $query_vars[] = 'designer_slug';
    return $query_vars;
}

जैसा कि आप देख सकते हैं, यह उत्तर मूल रूप से मेरे पिछले उत्तर के समान है , लेकिन नियम के बिना कोड में फ्लशिंग (ताकि आप इसे functions.phpप्लगइन के बजाय अपने विषय में उपयोग कर सकें ), और थोड़ा और अधिक निश्चितता और स्पष्टीकरण के साथ क्योंकि मैंने सीखा आपके पहले प्रश्न का उत्तर देने के बाद से (और क्योंकि) नियमों को फिर से लिखने के बारे में बहुत कुछ।

चेट रूम चर्चा

हमने चैट रूम में इस प्रश्न के लिए अंतिम मुद्दों को मंजूरी दी । अंत में, स्टीवन ने generate_rewrite_rulesहुक का उपयोग किया , क्योंकि add_rewrite_rule()फ़ंक्शन उसके लिए काम नहीं करता था।


2
@Steven: pagenameउस वर्डप्रेस पेज का स्लग है जिसे आप (डेटाबेस में रिकॉर्ड) दिखाना चाहते हैं। यह पृष्ठ तब संकेत कर सकता है कि वह designers.phpWP व्यवस्थापक क्षेत्र में टेम्पलेट फ़ाइल का उपयोग करना चाहता है । तो आप पृष्ठ स्लग को इंगित करते हैं, टेम्पलेट नाम को नहीं, क्योंकि उसी टेम्पलेट का उपयोग कई पृष्ठों के लिए किया जा सकता है: इस मामले में वर्डप्रेस को यह नहीं पता है कि आप क्या करना चाहते हैं।
Jan Fabry

1
@ उत्तर: मुझे लगता है कि आप जिस तरह से हुक स्थापित करते हैं, उससे अधिक जटिल हो जाता है। add_rewrite_rules()फ़ंक्शन को निकालें और add_filter()/add_action()सीधे कॉल करें । यदि यह एक थीम फ़ाइल में है, flush_rewrite_rules()तो नियमों को फ्लश करने के लिए ( wpse5413_init()और उन्हें जोड़ने और बाद में उन्हें हटाने के लिए) केवल Permalinks सेटिंग्स पृष्ठ पर जाएं । और मेरा प्लगइन वर्तमान पुनर्लेखन नियमों को प्रदर्शित करता है। याद रखें कि यह केवल आने वाले URL को बदलने का तरीका बताता है, न कि यह कि कैसे आपका कोड HTML में URL लिखेगा।
जन फैब्री डे

1
@ उत्तर: मुझे नहीं लगता कि आपको भी सेव बटन को हिट करना है, बस पर्मलिंक्स पेज को खोलना भी इसे फ्लश करेगा। और फिर, यह केवल /designers/designer-slug/URL को स्वीकार करने के लिए वर्डप्रेस की क्षमता को जोड़ देगा , आपको उन जगहों को बदलने की आवश्यकता है जहां आप इन URL को अपने HTML में लिखते हैं। /designers/Batlak-og-Selvig/अपने आप जाकर इसका परीक्षण करें, यदि यह काम करता है, तो उन सभी स्थानों को खोजें जो इन URL को उत्पन्न करते हैं और नई संरचना का उपयोग करने के लिए उन्हें बदलते हैं।
जान फेब्री डे

1
आह, अब मुझे लगता है कि मैं udnerstand शुरू कर रहा हूँ। मैंने सोचा था कि फिर से लिखना नियमों को बदल देगा कि कैसे ब्राउज़र यूआरएल क्षेत्र में यूआरएल को हटा दिया गया था। लेकिन इसका क्या मतलब है कि मुझे वास्तव में URL का उत्पादन करना है www.mysite.com/batlat-og-selvig/9और फिर यह "अनुवादित" है/?designer=Batlak-og-Selvig&bid=9
Steven

1
@ उत्तर: हाँ, वास्तव में: पुनर्लेखन नियम आने वाले लिंक को संभालते हैं, और (केवल कुछ चयनित मामलों में) आपके कोड में उत्पन्न लिंक को प्रभावित नहीं करते हैं।
Jan Fabry
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.