কাস্টম বিভাগ এবং পৃষ্ঠাগুলি পুনরায় লেখার ক্ষেত্রে স্লাগ সংঘাত 404 দেয়


9

আমি আমার কাস্টম ট্যাক্সনোমিজ তৈরি করতে কাস্টম পোস্ট প্রকারের ইউআই প্লাগইন ব্যবহার করছি। আমার কাছে একটি পোর্টফোলিও রয়েছে যা প্রযুক্তি এবং ক্লায়েন্টদের 2 টি কাস্টম ট্যাক্সনোমির সাথে প্রকল্পগুলি (কাস্টম পোস্টের ধরণ) দিয়ে তৈরি। ক্লায়েন্টদের অস্তিত্বের একটি কাস্টম রাইরাইট স্লাগ থাকে portfolio/clients/, যখন প্রযুক্তিগুলি বিভাগে একটি স্বনির্ধারিত পুনর্লিখন স্লাগ থাকেportfolio/

পুনর্লিখন:
portfolio/html <- পৃষ্ঠাটি HTML ব্যবহার করে সমস্ত প্রকল্প প্রদর্শন করে
portfolio/clients/client-a- পৃষ্ঠা ক্লায়েন্ট এ এর ​​জন্য সমস্ত প্রকল্প প্রদর্শন করে

এখন যখন আমি ক্লায়েন্টদের ইউআরএল স্লাগ রয়েছে তাদের জন্য একটি ল্যান্ডিং পৃষ্ঠা তৈরি করার চেষ্টা /portfolio/clientsকরি আমি 404 পৃষ্ঠাটি পাই। আমি বেশ নিশ্চিত যে এটি প্রযুক্তি বিভাগের দ্বন্দ্বের URL এর পুনর্লিখনের কারণে। প্রযুক্তি অনুমান বিভাগে এটি অনুসন্ধান করার সময় আমি অনুমান করছি, এটি বিদ্যমান নেই তখন এটি 404 পৃষ্ঠা ছড়িয়ে দেয়। সুতরাং আমি কীভাবে ইউআরএল পুনরায় লেখার স্লাগটি কাজ করতে পারি যাতে আমি যখন আঘাত করি তখন /portfolio/clientsএটি 404 পৃষ্ঠাটি ফেরত পাঠায় না এবং এটি সঠিক পৃষ্ঠাগুলি ব্যবহার করে?

উত্তর:


16

আপনার মনে হচ্ছে "আংশিক ভার্বোস পুনর্লিখনের নিয়ম" দরকার। ভারবোজ পুনর্লিখনের নিয়ম মানে সমস্ত পৃষ্ঠা শীর্ষে রাখা হয়েছে কারণ ওয়ার্ডপ্রেস কোনও পৃষ্ঠা এবং একটি পোস্টের মধ্যে পার্থক্যটি সনাক্ত করতে পারে না। এখানে এটি এটি এটি করতে পারে বলে মনে করে, কারণ ফর্মের সমস্ত ইউআরএলগুলি এইটি ব্যতীত portfolio/([^/]+)/আপনার portfolioশ্রেনীকরণ থেকে portfolio/clients/। আপনাকে এটিকে পুনর্লিখনের নিয়মের শীর্ষে রাখতে হবে, সুতরাং এটি আরও জেনেরিক পোর্টফোলিও বিভাগের আগে মেলে matches আপনি সম্ভবত পুনর্লিখনের সমস্ত নিয়মকে ভার্জোজ হতে বাধ্য করতে পারেন, তবে আপনার যদি প্রচুর পৃষ্ঠা থাকে তবে এটি কার্য সম্পাদনে প্রভাব ফেলবে।

এই উত্তরটি আমার কাছে পুনর্লিখনের নিয়মগুলির সুনির্দিষ্ট বোঝার সাথে লেখা হয়েছে, তাই আমি আশা করি এটি করা ভাল উপায় এবং উদাহরণ কোডটিতে খুব বেশি ত্রুটি থাকে না।

একটি পৃষ্ঠা কেবল একটি পুনর্লিখনের নিয়ম উত্পন্ন করে না, এটি একটি গোষ্ঠী উত্পন্ন করে:

  • (pagename)/trackback/?$
  • (pagename)/feed/(feed|rdf|rss|rss2|atom)/?$
  • (pagename)/(feed|rdf|rss|rss2|atom)/?$
  • (pagename)/page/?([0-9]{1,})/?$
  • (pagename)/comment-page-([0-9]{1,})/?$
  • (pagename)(/[0-9]+)?/?$

এগুলি আপনাকে নিজের তৈরি করতে হবে না, আপনি এর শক্তিটি পুনরায় ব্যবহার করতে পারেন WP_Rewrite। এর page_rewrite_rules()পদ্ধতিটি দেখুন: আমরা যদি ভার্বোস মোডে থাকি তবে এটি সমস্ত পৃষ্ঠাগুলির (এর মাধ্যমে page_uri_index()) এবং তাদের সংযুক্তির একটি তালিকা পেয়েছে , %pagename%পুনর্লিখনের ট্যাগটিকে ওভাররাইট করে এবং এই পৃষ্ঠার জন্য পুনর্লিখনের নিয়ম জেনারেট করে। আমরা এটিও করতে পারি:

// We only generate them for this page
$page_uri = 'portfolio/clients';
// Returns site root + '%pagename%'
$page_structure = $wp_rewrite->get_page_permastruct();
// Everywhere you see %pagename% in the structure used to generate rules
// in the next step, replace it with our fixed page name
$wp_rewrite->add_rewrite_tag('%pagename%', "({$page_uri})", 'pagename=');
// This generates the group given above
$page_rewrite_rules = $wp_rewrite->generate_rewrite_rules($page_structure, EP_PAGES);

এটি আমাদের পৃষ্ঠাগুলির জন্য বিধিগুলি দেবে, তবে পৃষ্ঠায় ব্যবহৃত সংযুক্তির জন্য এখনও নয়। আপনি যদি সেগুলিও চান তবে প্রতিটি সংযুক্তির পদক্ষেপটি পুনরাবৃত্তি করুন তবে add_rewrite_tag('%pagename%', "({$attachment_uri})", 'attachment=')( page_rewrite_rules()আরও বিশদে বিশদে দেখুন) with

ভাল, আমরা বিধিগুলি পেয়েছি, তবে এখন আপনাকে সেগুলি কোনওভাবে সম্পূর্ণ পুনর্লিখনের কাঠামোতে যুক্ত করতে হবে। আপনি এটি দিয়ে এটি করতে পারেন add_rewrite_rule()তবে $page_rewrite_rulesঅ্যারেতে উত্পন্ন প্রতিটি নিয়মের জন্য আপনাকে অবশ্যই এটি কল করতে হবে । এই কারণে, অনেক মানুষ মধ্যে হুক ফিল্টার , যেহেতু আপনি শুধু সেখানে অ্যারের পরিবর্তন করতে পারেন।rewrite_rules_array

add_filter('rewrite_rules_array', 'add_verbose_portfolio_clients_page');
function add_verbose_portfolio_clients_page($rewrite_rules)
{
    global $wp_rewrite;

    // The previous code snippet comes here, where we generate $page_rewrite_rules

    // Our rules have priority, they should be on top
    $rewrite_rules = array_merge($page_rewrite_rules, $rewrite_rules);

    return $rewrite_rules;
}

আপনি এই ফিল্টারটি অন্তর্ভুক্ত করার পরে, আপনাকে পুনর্লিখনের নিয়মগুলি ফ্লাশ করা উচিত (একবারে, প্রতিটি পৃষ্ঠার লোড এক নয়, কারণ এটি বেশ ভারী। আপনি কল করে flush_rewrite_rules()বা "পারমালিঙ্কস" সেটিংস পৃষ্ঠাতে গিয়ে এটি করতে পারেন ।


অসাধারণ! ধন্যবাদ জান! এটি কাজ করে। আমি এর থেকে আরও ভাল ব্যাখ্যা পেতে পারি না।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.