Add_rewrite_rule সাহায্য প্রয়োজন


55

সমাধান


আমি আপডেট 3 নিয়ে চলেছি এবং এটি কাজ করে চলেছি। যা আমি ভুল বুঝেছিলাম তা হ'ল আমি বিশ্বাস করি যে পুনর্লিখনের নিয়মটি পরিবর্তিত designers/?designer=some-designer&bid=9হবে /designers/some-designer। তবে এটি অবশ্যই অন্যভাবে।


আমি কিছু গবেষণা করে চলেছি তবে অ্যাড_উরাইট_রুল () কীভাবে ব্যবহার করতে হয় তা আমি পুরোপুরি পাই না ।

এই পোস্টটি আমার যা প্রয়োজন তার খুব কাছাকাছি, তবে আমার কি সত্যিই এত কোড দরকার?

আমার বর্তমান লিঙ্কটি হ'ল:
http : //www.nor
Dutchfashion.no/designers/?designer=Batlak-og-Selvig&bid=9 আমি যা চাই তা হল এই http : //www.nor
Turkfashion.no/designers/Batlak-og-Selvig /

  1. আমি কীভাবে ব্যবহার করব add_rewrite_rule()?
  2. আমার ডিজাইনার আইডি (বিড) পাস করতে হবে। ইউআরএল-এ প্রদর্শিত হ'ল পুনর্লিখনের নিয়ম ব্যবহার করার সময় আমি কীভাবে এটি করতে পারি?

আপডেট 1

আমি এটি খুঁজে পেয়েছি যা কিছুটা ব্যাখ্যামূলক। তবে এটি কাজ করছে না:

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')

আপডেট 2

আমি চেষ্টা করেছি এমন আরও একটি সমাধান, যা জান ফ্যাব্রি অন্য থ্রেডে প্রস্তাব করেছেন। আমি এটি আমার ফাংশন.এফপিতে রেখেছি, তবে এর কোনও প্রভাব নেই।

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
মনে হচ্ছে আমার পুনর্লিখনের নিয়মগুলি যুক্ত করা হয়নি। নতুন নিয়মগুলি ছড়িয়ে দেওয়ার ফলশ্রুতি সম্পাদন: print_r($wp_rewrite)আমার নতুন পুনর্লিখনের বিধিগুলিকে অন্তর্ভুক্ত করে না।

আপডেট 6
আমি জান এর সমাধান পরীক্ষা করেছি। তবে ইউআরএল পরিবর্তন হয় না :(

/* 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;
}

কেউ যদি আমাকে এই সমস্যা সমাধানে সহায়তা করতে সক্ষম হন তবে আমি সত্যই এটির প্রশংসা করব।


আপনি এখানে জিজ্ঞাসা করা প্রথম প্রশ্নের সাথে এটি খুব মিল দেখাচ্ছে এবং যার জন্য আমি একটি উত্তর দিয়েছি । এরপরেও কি পরিস্থিতি বদলেছে, তাই আমার উত্তরটি আর কার্যকর হবে না? আপনি যদি নিজের ইউআরএলে ডিজাইনার আইডি না চান, আপনাকে নিজেরাই "স্লাগ" আইডিতে রূপান্তর করতে হবে, ওয়ার্ডপ্রেস আপনার পক্ষে এটি করতে পারে না। ডিজাইনাররা কি এখনও একটি বাহ্যিক বস্তু?
জান ফ্যাব্রি

@ জন ফ্যাব্রি হ্যাঁ, আমি এটি পোস্ট করার পরে আবিষ্কার করেছি (আমি ভুলে যাচ্ছিলাম)। এখন আমি আপনার পরামর্শটি আরও ভাল করে বুঝতে পারি। আমার আপডেট হওয়া কোডটি এখানে দেখুন। আমার ডিজাইনাররা এখনও কাস্টম ডিবিতে প্রবেশ রয়েছে। এর পাশ দিয়ে যাওয়ার জন্য কি পোষ্ট ইনসেটেড ও জিইটি ব্যবহার করা সম্ভব bid?
স্টিভেন

যদি আমি লিঙ্কটি অনুলিপি করে অন্য কারও কাছে প্রেরণ করি তবে একটি পোষ্ট অনুরোধ ব্যবহার করা খারাপ হবে না। স্লাগটিকে অনন্য করে তোলা এবং সেখান থেকে ডেটা লুপ করা কি সমস্যা?
জান ফ্যাব্রি

@ জান ফ্যাবরি: আপনি কী বোঝাতে চেয়েছেন slug? Design ডিজাইনের ডেটা পুনরুদ্ধার করা bidতার চেয়ে অনেক বেশি সহজdesigner
স্টিভেন

উত্তর:


87

পুনর্লিখনের নিয়মের কিছু পটভূমি

ডাব্লুপি পুনর্লিখন সিস্টেমটি জটিল দেখায় তবে বাস্তবে এটি কীভাবে কাজ করে তা বোঝা খুব কঠিন নয়। এটি সুন্দর ইউআরএল ( /designers/) পার্স করতে ব্যবহার করা হয় যেন তারা অ-সুন্দর ( /index.php?pagename=designers)। প্রাথমিক ধারণাটি হ'ল আপনার কাছে পুনর্লিখনের নিয়মের একটি তালিকা রয়েছে , নিয়মিত প্রকাশ যা আগত ইউআরএলগুলির সাথে মেলে এবং এগুলি আবার কিছু ইউআরএলগুলিতে পুনরায় লিখন করতে পারে বেশিরভাগ index.phpক্যোয়ারী ভেরিয়েবলের আকারে । এই পরিবর্তনগুলি URL টির সাথে মিলে যাওয়া নিয়মিত অভিব্যক্তির অংশগুলিতে সেট করা আছে। নিয়মগুলি উপরে থেকে নীচে মূল্যায়ন করা হয়, সুতরাং যদি দুটি নিয়ম মেলে তবে প্রথমটি "জিতবে"।

এই পুনর্লিখনের নিয়মগুলি কল করে ডেটাবেজে সংরক্ষণ করা হয় flush_rewrite_rules(), তবে এই বিধিগুলি তৈরি করা এবং লেখা একটি ব্যয়বহুল ক্রিয়াকলাপ, আপনার এটি প্রতিটি করা উচিত নয় init। পরিবর্তে, আপনি কেবল তখনই নিয়মগুলি পরিবর্তন করেন: সম্ভবত প্লাগইন অ্যাক্টিভেশন (ব্যবহার register_activation_hook()) বা ম্যানুয়ালি পেরমালিংকস সেটিংস পৃষ্ঠাতে গিয়ে ( কারণ থিম অ্যাক্টিভেশনে এটি স্বয়ংক্রিয়ভাবে করা শক্ত )। আপনি যদি নিয়মগুলি ফ্লাশ না করেন তবে কল add_rewrite_rule()করার কোনও প্রভাব নেই। আপনি নিয়মগুলি সরিয়ে দেওয়ার পরেও add_rewrite_rule()প্রত্যেককে কল করা কোনও সমস্যা নয় init

আপনার পুনর্লিখনের নিয়মগুলি যুক্ত করার বিভিন্ন উপায় রয়েছে এবং আপনি যদি কেবল একটি নিয়ম যুক্ত করতে চান তবে আপনি এটি দিয়ে এটি করতে পারেন add_rewrite_rule()। কারণ পোস্ট, পেজ, taxonomies জন্য নিয়ম, ... একাধিক নিয়ম ফলে, তারা মত উচ্চ পর্যায়ে ফাংশন সঙ্গে নির্মিত add_rewrite_tag(), add_permastruct(), ... কিন্তু এই সহজ ক্ষেত্রে আমরা এখানে আছে তাদের জন্য প্রয়োজন হয় না।

কিছু ফিল্টারও রয়েছে, তাই আপনি হুক generate_rewrite_rulesবা generate_rewrite_rules_arrayহুক ব্যবহার করে আপনার বিধিগুলিও যুক্ত করতে পারেন । এগুলি আপনাকে সম্পূর্ণ বিধিগুলির উপর খুব বিস্তারিত নিয়ন্ত্রণ দেয়, তবে add_rewrite_rule()আপনি যদি কেবল একটি নিয়ম যুক্ত করতে চান তবে তা যথেষ্ট।

আমি একটি সামান্য প্লাগইন তৈরি করেছি যা আপনাকে বর্তমানের পুনর্লিখনের নিয়মগুলি বিশ্লেষণ করতে দেয় এবং (অবশ্যই) আমি যখনই কোনও পরিবর্তন করার চেষ্টা করি তখন আপনাকে এটি ব্যবহার করার পরামর্শ দিই।

ইউআরএল থেকে আপনার অতিরিক্ত তথ্য প্রাপ্ত করা

আপনার দেওয়া উদাহরণটি তৈরি করুন। Batlak og Selvigআপনার নম্বর ডিজাইন ( bid) সহ ডিজাইনার ব্র্যান্ড রয়েছে 9। আপনি এই আইডিটি ইউআরএলটিতে চান না, তবে কেবল নামটি। আমরা (স্পেস বা বিশেষ অক্ষর ছাড়া) নাম URL টি বান্ধব সংস্করণ কল স্লাগ্ : Batlak-og-Selvig

সাধারণভাবে, 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একটি প্লাগিনের পরিবর্তে আপনার থিমের ব্যবহার করতে পারেন ), এবং আরও কিছুটা দৃty়তা এবং ব্যাখ্যা সহ কারণ আমি শিখেছি আপনার প্রথম প্রশ্নের উত্তর দেওয়ার পরে (এবং কারণ) পুনর্লিখনের নিয়ম সম্পর্কে প্রচুর।

চ্যাট রুম আলোচনা

আমরা এই প্রশ্নের জন্য চ্যাট রুমে চূড়ান্ত বিষয়গুলি পরিষ্কার করেছি । শেষ পর্যন্ত, স্টিভেন হুকটি ব্যবহার করেছিলেন generate_rewrite_rules, কারণ add_rewrite_rule()ফাংশনটি তার পক্ষে কাজ করে বলে মনে হয় নি।


2
@ স্টিভেন: pagenameহ'ল ওয়ার্ডপ্রেস পৃষ্ঠার স্লাগ যা আপনি প্রদর্শন করতে চান (ডাটাবেসে রেকর্ড)। এই পৃষ্ঠাটি তখন designers.phpডাব্লুপি প্রশাসক অঞ্চলে টেম্পলেট ফাইলটি ব্যবহার করতে চায় তা নির্দেশ করতে পারে । সুতরাং আপনি পৃষ্ঠা স্লাগের দিকে লক্ষ্য করুন, টেমপ্লেটের নাম নয়, যেহেতু একই টেম্পলেটটি একাধিক পৃষ্ঠাগুলির জন্য ব্যবহার করা যেতে পারে: এক্ষেত্রে ওয়ার্ডপ্রেস আপনি কী করতে চান তা জানেন না।
জান ফ্যাব্রি

1
@ স্টিভেন: আমি মনে করি আপনি যেভাবে হুকগুলি সেট আপ করেছেন তার চেয়ে বেশি জটিল করে তোলেন। add_rewrite_rules()ফাংশনটি সরান এবং add_filter()/add_action()সরাসরি কল করুন । যদি এটি কোনও থিম ফাইলে থাকে flush_rewrite_rules()তবে নিয়মগুলি ফ্লো করতে (বা এগুলিতে যুক্ত করুন wpse5413_init()এবং সেগুলি পরে মুছে ফেলুন) সরান এবং কেবল পারমলিংকস সেটিংস পৃষ্ঠাতে যান just এবং আমার প্লাগইন বর্তমান পুনর্লিখনের নিয়মগুলি প্রদর্শন করে। মনে রাখবেন যে এটি কেবল আগত ইউআরএলগুলি হ্যান্ডেল করার পদ্ধতি পরিবর্তন করে, আপনার কোডটি কীভাবে এইচটিএমএলতে ইউআরএল লিখবে তা নয়।
জান ফ্যাব্রি

1
@ স্টিভেন: আমার মনে হয় না আপনি এমনকি সেভ বোতামটিও চাপতে পারেন, কেবল পারমালিক্স পৃষ্ঠাটি খোলার ফলে এটি প্রবাহিত হবে। এবং আবার, এটি কেবল ওয়ার্ডপ্রেসকে /designers/designer-slug/ইউআরএল গ্রহণ করার সক্ষমতা যোগ করবে , আপনি নিজের এইচটিএমএলগুলিতে যেখানে এই ইউআরএলগুলি লিখেন সে স্থানগুলি আপনাকে পরিবর্তন করতে হবে। /designers/Batlak-og-Selvig/নিজের কাছে গিয়ে এটি পরীক্ষা করুন, যদি এটি কাজ করে তবে এই URL গুলি তৈরি করে এমন সমস্ত জায়গাগুলি সন্ধান করুন এবং নতুন কাঠামোটি ব্যবহার করার জন্য তাদের পরিবর্তন করুন।
জান ফ্যাব্রি

1
আহ, এখন আমি মনে করি আমি উদ্বোধন শুরু করছি। আমি ভেবেছিলাম যে ব্রাউজারগুলির ইউআরএল ফিল্ডে ইউআরএলকে কীভাবে ছড়িয়ে দেওয়া হয়েছিল তা পুনর্লিখনের নিয়মগুলি বদলে দেবে। তবে এর অর্থ হ'ল আমাকে আসলে ইউআরএল আউটপুট করতে হবে www.mysite.com/batlat-og-selvig/9এবং তারপরে এটি "অনুবাদ করা" হবে/?designer=Batlak-og-Selvig&bid=9
স্টিভেন

1
@ স্টিভেন: হ্যাঁ, প্রকৃতপক্ষে: পুনর্লিখনের নিয়মগুলি আগত লিঙ্কগুলি পরিচালনা করে এবং (কেবলমাত্র কয়েকটি নির্বাচিত ক্ষেত্রে) আপনার কোডের উত্পন্ন লিঙ্কগুলিকে প্রভাবিত করে না।
জান ফ্যাব্রি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.