প্লাগিনের স্কোপের মধ্যে পুনরায় লেখার নিয়মগুলি যথাযথভাবে কোথায় ফ্লাশ করবেন?


10

পুনর্লিখনের নিয়মগুলি সঠিকভাবে ফ্লাশ হচ্ছে না তা নিয়ে আমার কিছুটা অদ্ভুত সমস্যা হচ্ছে।

আমি ব্যবহার করার চেষ্টা করেছি flush_rewrite_rules();এবং flush_rewrite_rules(true);

আমি এবং $wp_rewriteব্যবহার করে বিশ্বায়নের চেষ্টা করেছি tried$wp_rewrite->flush_rules();$wp_rewrite->flush_rules(true);

যার মধ্যে দুটিই পুনরায় লেখার নিয়মগুলি সঠিকভাবে ফ্লাশ করছে বলে মনে হচ্ছে না। কল করা হলে সেই কলগুলি পুনরায় লেখার নিয়মগুলি ফ্ল্যাশ করছে। আমি এটা কিভাবে জানি? পুনরায় লেখার নিয়ম ফ্লাশিংয়ের ডিবাগিংয়ের জন্য সমাধানটি ব্যবহার করে ।

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

ব্যবহারকারীদের প্লাগইনটি কনফিগার করতে আমার কাছে একটি প্লাগইন প্রশাসনের সেটিংস পৃষ্ঠা রয়েছে। কিছু সেটিংস পারমালিঙ্ক কাঠামো সামঞ্জস্য করে, তাই প্লাগইন প্রশাসনের সেটিংস পৃষ্ঠায় "সংরক্ষণ সেটিংস" পৃষ্ঠায় পুনর্লিখনের নিয়মগুলি ফ্লাশ করা দরকার। update_option();সেটিংস সংরক্ষণের জন্য (মান ব্যবহার করে )।

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

পুনঃলিখনের নিয়মগুলি সরবরাহ করে ডিবাগ করার জন্য উপরের লিঙ্ক সমাধানটি @toschoপ্রদর্শিত হচ্ছে যে এটি পুনরায় লেখার নিয়মগুলি প্রচুর পরিমাণে ফ্লাশ করছে। যাইহোক, কাস্টম পোস্ট টাইপ একক আইটেম, বা এমনকি কাস্টম পোস্ট টাইপ সংরক্ষণাগারটি দেখার জন্য যখন প্রত্যেকটি 404 ত্রুটি হিসাবে ফিরে আসে।

কাস্টম পোস্টের ধরণটি সঠিকভাবে এবং যথাযথভাবে নিবন্ধভুক্ত। আমি নিশ্চিত জানি যে এটি সমস্যা নয়।

তাত্ক্ষণিকভাবে প্লাগইন প্রশাসনের পৃষ্ঠা সেটিংস সংরক্ষণের সাথে অনুসরণ করুন। কাস্টম পোস্টের প্রকারগুলি তৈরি করা হয়, পারমালিঙ্ক কাঠামোটি সামঞ্জস্য করা হয় এবং সমস্ত পুনর্লিখনের নিয়মগুলি ফ্লাশ করার চেষ্টা করা হয়।

এরপরে কাস্টম পোস্টের ধরণগুলি সর্বদা লোড হয় initএবং সাধারণের মতো লোড হয় ।

কোনও কারণে, পুনর্লিখনের নিয়মগুলি সঠিকভাবে ফ্লাশ হচ্ছে না, কারণ আমি আগেই বলেছি, কাস্টম পোস্ট টাইপের একক বা সংরক্ষণাগার বিভাগগুলিতে গিয়ে 404 ত্রুটি ফিরে আসে।

এখন অদ্ভুত অংশটি, যদি আমি কেবল কিছু করি প্রশাসনিক পারমিলিংকস সেটিংস পৃষ্ঠাতে যান এবং তারপরে কাস্টম পোস্ট ধরণের একক বা সংরক্ষণাগার বিভাগগুলি দেখতে সামনের প্রান্তে ফিরে যান, তারা যাদুকরীভাবে প্রত্যাশার মতো কাজ করে।

প্রশাসন প্রশাসনের সেটিংস পৃষ্ঠাটি কী করে যে আমি তা করছি না যা পুনর্লিখনের নিয়মগুলি যথাযথভাবে ফ্লাশ করতে দেয় এবং আমার তা না করে?

আমি বলতে চাইছি, একটি অস্থায়ী সমাধান হিসাবে, আমি প্লাগইন প্রশাসনের সেটিংস পৃষ্ঠাটি সংরক্ষণ করার পরে ব্যবহারকারীকে প্রশাসনের Permalinks সেটিংস পৃষ্ঠায় পুনর্নির্দেশ করছি, তবে এটি কোনও আদর্শ সমাধান নয়। আমি আমার পুনর্লিখনের নিয়মগুলিকে আমার প্লাগইনের কোডের মধ্যে সঠিকভাবে ফ্লাশ করতে পছন্দ করব।

ওয়ার্ডপ্রেসে একটি নির্দিষ্ট পয়েন্ট রয়েছে যেখানে পুনর্লিখনের নিয়মগুলি ফ্লোশিং করা সমস্ত নিয়মকে আর ফ্লাশ করে না?

admin_menu - প্লাগইন সেটিংস পৃষ্ঠাটি ওয়ার্ডপ্রেস প্রশাসনে যুক্ত করা হয়েছে।

add_options_page() - প্লাগইন সেটিংস পৃষ্ঠাটি সেটিংস মেনুতে যুক্ত করা হয়েছে।

এর জন্য কলব্যাকে সেটিংস পৃষ্ঠাটি রেন্ডার করা হয় add_options_page()। এটি এখানে $_POSTপ্লাগইন সেটিংস আপডেট করার জন্য এবং পুনরায় লেখার নিয়মগুলি ফ্লাশ করার জন্য প্রক্রিয়া করা হয়।

যেহেতু এটি ইতিমধ্যে একটি দীর্ঘ প্রশ্ন, আমি একটি বৈধ উত্তর উত্পাদন করতে সহায়তা করতে একটি অফসাইট লিঙ্কে কোড ব্লক (যদি এটি সাহায্য করে) সরবরাহ করতে ইচ্ছুক।


1
দেখে মনে হচ্ছে যে আপনি জিনিসগুলির ক্রমটি ভুল পেয়েছেন, কিছু কোড না দেখে বলা শক্ত। পারমালিঙ্কস অ্যাডমিন পৃষ্ঠাটি কেবল কল করে flush_rewrite_rules, যা কেবল rewrite_rulesবিকল্পটি মুছে ফেলে এবং এটি পুনরায় জেনারেট করে, আপনি ফাইলটি খুলতে পারেন এবং এটি wp-admin/options-permalinks.phpকোথায় ঘটে তা দেখতে পারেন। যেহেতু এই ক্রিয়াকলাপটি কেবল পুরো বিকল্পটি মুছে ফেলে তাই আংশিকভাবে বিধি বিধান করা সম্ভব নয়।
মিলো

@ মিলো আমি মনে করি আপনি ঠিক বলেছেন আমার একটি ক্লাস রয়েছে যা লোড করা হয়েছে initযা পোস্টের ধরণের নিবন্ধগুলি রেখেছে। আমি অনুভব করেছি, পৃষ্ঠার সেটিংস সংরক্ষণ করা হচ্ছে এবং পৃষ্ঠাটি পুনরায় লোড হবে ... তারপরে initপ্রয়োজনীয় পোস্টের প্রবন্ধগুলি নিবন্ধ করার জন্য আবার হুক ফায়ার করা হবে। সুতরাং আমি বুঝতে পেরেছি যে পোস্টের প্রকারগুলি ইতিমধ্যে লোড হবে এবং আমার যা করতে হবে তা হ'ল বিকল্পটি আপডেট করতে হবে, তারপরে আমার প্লাগইন সেটিংস পৃষ্ঠা থেকে পুনর্লিখনের নিয়মগুলি ফ্লাশ করুন। আমি কীভাবে একটি সমাধান বের করেছিলাম তার একটি উত্তর পোস্ট করব।
মাইকেল একলুন্ড

আমার প্লাগইনটিতে কেবলমাত্র একটি সতর্কতা ফ্লাশ_প্রিট_আরুলস () আমার জন্য সমস্যার অংশ হিসাবে শেষ হয়েছিল। আমি পিএইচপি হুকটি মুছে ফেলেছি এবং কেবলমাত্র নিজেই পারমালিক্স আপডেট করছি এবং আমার সিপিটি 404 ত্রুটিগুলি অদৃশ্য হয়ে গেল।
myol

উত্তর:


4

পুনর্লিখনের নিয়মগুলি ফ্লাশ করার সর্বোত্তম জায়গা হ'ল প্লাগইন অ্যাক্টিভেশন / নিষ্ক্রিয়করণ।

function myplugin_activate() {
    // register taxonomies/post types here
    flush_rewrite_rules();
}

register_activation_hook( __FILE__, 'myplugin_activate' );

function myplugin_deactivate() {
    flush_rewrite_rules();
}
register_deactivation_hook( __FILE__, 'myplugin_deactivate' );

কোডেক্স নিবন্ধ দেখুন

অগ্রিম ক্ষমাপ্রার্থনা, আপনার প্রশ্নের মাধ্যমে আমি এটি পুরোপুরি তৈরি করিনি, সুতরাং এটি কুকি কাটারের প্রতিক্রিয়া of


1
আপনার পরামর্শের জন্য ধন্যবাদ, তবে আমি এটি সম্পর্কে সচেতন। সমস্যাটি প্লাগইন অ্যাক্টিভেশন / প্লাগইন নিষ্ক্রিয়করণ সম্পর্কিত নয়। এটি ব্যবহারকারীদের ইতিমধ্যে সক্রিয় প্লাগইনে সেটিংস পরিবর্তন করার সাথে সম্পর্কিত যা পুনর্লিখনের নিয়মগুলি সামঞ্জস্য করে, এভাবে ফ্লাশের প্রয়োজন হয়।
মাইকেল একলুন্ড

1
আমি ভেবেছিলাম এটি হতে পারে তবে আমি আপনার প্রশ্নটি পড়তে গিয়ে বেশ ক্লান্ত হয়ে পড়েছিলাম। আইওসিনের সমাধানটি আশাব্যঞ্জক বলে মনে হচ্ছে, আশা করি আপনি এটি কার্যকর করেছেন।
হেলগাটিভিকিং

4

আপনার কোডটি না দেখে কী ভুল হয়েছে তা বলা শক্ত। তবে কিছু সেটিংস সংরক্ষণের পরে admin_initআপনার পুনর্লিখনের নিয়মগুলি ফ্লাশ করার জন্য নীচে দেখানো মত হুক করা ব্যবহারিক ।

কোড:

add_action('admin_init', 'wpse_123401_plugin_settings_flush_rewrite');
function wpse_123401_plugin_settings_flush_rewrite() {
    if ( get_option('plugin_settings_have_changed') == true ) {
        flush_rewrite_rules();
        update_option('plugin_settings_have_changed', false);
    }
}


আপনার সেটিংস পৃষ্ঠায় যেখানে আপনাকে বিকল্পটি সেট করতে হবে বা সেটিংস সংরক্ষণের প্রক্রিয়ায় কিছুটা সঠিক হতে হবে। বিকল্প ছাড়াই এটি করা খারাপ, কারণ আপনি প্রতিবার নিয়মগুলি ফ্লাশ করতে চান না।


দ্রষ্টব্য: অরক্ষিত


2
অথবা আপনি একটি ক্ষণস্থায়ী সম্ভবত ব্যবহার করতে পারেন? তবে অবশ্যই প্রতিটি অ্যাডমিন_ইনিতে নিয়মগুলি ফ্লাশ না করার জন্য +1 করুন।
হেলগাটিভিকিং

আপনি অবশ্যই ক্ষণস্থায়ী সম্পর্কে সঠিক, আমার ধারনা আমি *_option()সেটিংস পৃষ্ঠার কারণে বেছে নিয়েছি । @ হেলগাথেভিকিং
নিকোলাই

এটি খুব সহায়ক ছিল। মাইকেরও আমার একই অবস্থা ছিল। আমি একটি ক্ষণস্থায়ী ব্যবহার সম্পর্কে হেলগার পরামর্শ অন্তর্ভুক্ত করেছিলাম এবং আমি সেটিংসের বৈধতা ফাংশনে সেট করেছিলাম। আমি ফ্লাশিংয়ের পরে ট্রান্সিয়েন্টটিকে মিথ্যাতে সেট করার প্রয়োজন শেষ করেছিলাম অন্যথায় এটি ক্ষণস্থায়ীটির মেয়াদ শেষ না হওয়া অবধি প্রতিটি অ্যাডমিন পৃষ্ঠা লোডে ফ্লাশ করে চলেছে। সুতরাং কার্যকরীভাবে একটি বিকল্প বা একটি ক্ষণস্থায়ী ব্যবহার একই ছিল। আমি অনুমান করি ক্ষণস্থায়ী কেবলমাত্র বিকল্পের টেবিলটিকে কিছুটা পরিষ্কার রাখার জন্য সুন্দর হতে পারে। তবে একটি ছোটখাটো বিষয়।
ম্যাথুলি

পার্থক্যটি আসলেই সামান্য, বিশেষত যদি স্থানান্তর স্থায়ী হয়, অ-মেয়াদোত্তীর্ণ হয় তবে অবশ্যই স্থানান্তরের অন্যান্য ক্ষমতা রয়েছে, সুবিধাগুলি রয়েছে যাগুলি ভাল। @ ম্যাথলেলি
নিকোলাই

3

আমার একটি পোস্ট ধরণের শ্রেণীর ফাইল ছিল যা প্লাগইনের বিকল্প সেটিংস পড়ার জন্য এবং ব্যবহারকারী নির্দিষ্ট সেটিংসের উপর ভিত্তি করে প্রয়োজনীয় কাস্টম পোস্ট প্রকার তৈরির জন্য দায়বদ্ধ ছিল।

এই পোস্টের ধরণের ক্লাস ফাইলটি হুকের উপরে লোড করা হয়েছিল init

আমি তখন যা করতে হবে তা আমি প্লাগইন সেটিংস আপডেট করে, তারপরে পুনর্লিখনের নিয়মগুলি ফ্লাশ করেছি ured পোস্ট টাইপ ক্লাসটি ইতিমধ্যে প্লাগইন সেটিংসের ভিত্তিতে লোড করা হয়েছিল। তবে প্রশাসনের পৃষ্ঠাগুলি সহ, তারা initহুকের পরে লোড করা হয় ।

পোস্টের ধরণগুলি আসলে কখনই নিবন্ধিত হয় নি, কারণ সেটিংসটি এখনও সেট করা হয়নি। পোস্ট ধরণের নিবন্ধকরণ শ্রেণি নিবন্ধিত কোনও পোস্ট প্রকার ছাড়াই অকালে শেষ হয়ে যায়।

সমাধানটি ছিল:

  1. প্লাগইন সেটিংস আপডেট করুন।
  2. কেবলমাত্র পুনরায় লেখার নিয়ম তৈরি হওয়ার জন্য পোস্ট টাইপ শ্রেণীর ফাইলটি কেবলমাত্র এখানে একবার লোড করুন।
  3. পুনর্লিখনের নিয়মগুলি ফ্লাশ করুন।

(পূর্বে ... ধাপ 2 অনুপস্থিত ছিল - উপরে উল্লিখিত হিসাবে ...)

এখন থেকে, পোস্টের প্রকারগুলি initহুকের উপরে লোড হবে এবং ইতিমধ্যে নির্দিষ্ট সেটিংস থাকবে, যাতে পোস্টের প্রকারগুলি যথাযথ পুনর্লিখনের নিয়মগুলির সাথে তৈরি এবং জোড় করার অনুমতি দেয়।

যে কারণেই হোক না কেন, উপরের তিনটি পদক্ষেপের পরে, আমাকে বর্তমান পৃষ্ঠায় পুনর্নির্দেশের জন্য একটি জাভাস্ক্রিপ্ট কল যুক্ত করতে হয়েছিল।

flush_rewrite_rules();প্লাগইনের প্রশাসনের সেটিংস পৃষ্ঠায় আমাকে একটি কলও যোগ করতে হয়েছিল।

সুতরাং নিশ্চিত করার জন্য যে সমস্ত কিছু নিবিষ্ট ...

পদক্ষেপ 1) প্লাগইনের প্রশাসনের সেটিংস পৃষ্ঠাতে নেভিগেট করুন। - প্রাথমিক ফ্লাশ

পদক্ষেপ 2) প্লাগইন সেটিংস আপডেট করুন। - দ্বিতীয় ফ্লাশ

পদক্ষেপ 3) পৃষ্ঠাটি প্লাগইনের সেটিংস পৃষ্ঠায় পুনর্নির্দেশ করে। এর কারণ ... তৃতীয় এবং চূড়ান্ত ফ্লাশ (প্রাথমিক ফ্লাশের সমান - প্লাগইনের সেটিংস পৃষ্ঠাটি দেখার পরে স্বয়ংক্রিয়ভাবে সম্পন্ন)

আমি বলছি না এটি একটি ব্যবহারিক সমাধান, তবে এটি আমার পক্ষে কাজ করেছিল। খুব অদ্ভুত ইস্যু এবং সম্ভবত আমার কোডিং অবকাঠামোটি করতে হবে।


1

@ তাজো-টুডো মাল্টিসাইট ব্যবহার করার সময় এটি আমার জন্যও কাজ করেছিল।

add_action( 'wpmu_new_blog', 'set_my_permalink_structure', 11, 2 );

function set_my_permalink_structure( $blog_id ) {

    switch_to_blog( $blog_id );

    global $wp_rewrite;
    $wp_rewrite->set_permalink_structure( '/%postname%/' );
    $wp_rewrite->flush_rules();
    $wp_rewrite->init();

    restore_current_blog();
}

0

আমার সলিউশন ওয়াস পাওয়া গেছে:

global $wp_rewrite; $wp_rewrite->flush_rules(); $wp_rewrite->init();

0

আমার ঠিক একই সমস্যা ছিল আমার প্লাগইনে আমার কাছে পোস্টের প্রকার রয়েছে যা গতিশীলভাবে তৈরি হয়েছিল। সেহেতু এগুলি register_post_type()কোনও স্থির পদ্ধতিতে রেজিস্ট্রেশন করা যাবে না activation_hookএবং flush_rewrite_rules()এই হুক চলাকালীন চালিত হওয়ার পরে এখনও সক্রিয় হয় না (যা সাধারণত পুনরায় লেখার নিয়মগুলি ফ্লাশিংয়ের প্রস্তাবিত উপায় )।

পরিশেষে আমি যে পরিষ্কার সমাধানটি নিয়ে আসতে পারি তা হ'ল পোস্টের নিবন্ধনের পরে পুনর্লিখনের নিয়মগুলি ফ্লাশ করা, তবে অবশ্যই এই ধরণের ফ্লাশিং আসলেই প্রয়োজনীয় ছিল (কারণ অপারেশনটি ধীর গতিতে)। আমার ক্ষেত্রে আমার কাছে বেশ কয়েকটি কাস্টম পোস্ট ধরণের রয়েছে যা একটি একক বেস শ্রেণীর উত্তরাধিকার সূত্রে প্রাপ্ত এবং তাই সেখানে ফ্লাশিং কোডটি কার্যকর করা বাঞ্ছনীয় ছিল।

ফ্লাশিং প্রয়োজনীয় কিনা এর ফলাফল আউটপুট দেখে সিদ্ধান্ত নেওয়া যেতে পারে get_option( 'rewrite_rules' ):

class MyPostTypeClass {

public final function register_as_custom_post_type() {
    ...   //do all the setup of your post type here     
    $args = array(
                  ... //populate the other arguments as you see fit
                  'rewrite' => array('slug' => 'slug-of-your-post-type')
                 );
    register_post_type('post-type-name-of-your-post-type', $args );

    $rewrite_rules_must_be_fluhed = true;
    foreach( get_option( 'rewrite_rules' ) as $key => $rule)
        if(strpos($key, $args['rewrite']['slug'] ) === 0)
        {
            $rewrite_rules_must_be_fluhed = false;
            break;
        }
    if($rewrite_rules_must_be_fluhed)
        flush_rewrite_rules(true);
}
}

অপূর্ণতা:

  • ডাব্লুপি সময়কালে সঠিক পুনর্লিখনের বিধিগুলি তৈরি করে এমন কিছুটা নির্ভর করে register_post_type()
  • প্রতিটি পৃষ্ঠা লোড চলাকালীন ফ্লাশিং প্রয়োজন কিনা তা পরীক্ষা করে কিছু ওভারহেড তৈরি করে।

সুবিধাদি:

  • পুরোপুরি পোস্ট টাইপ প্রতিনিধিত্বমূলক ক্লাসে encapsulated।
  • সত্যই প্রয়োজনে পুনর্লিখনের নিয়মগুলি কেবল ফ্লাশ করে।

কেবলমাত্র এটি ব্যবহার করুন যদি আপনি কোনও স্থির ক্রিয়ায় আপনার পোস্টের ধরণটি নিবন্ধন করতে না পারেন যা উভয় initএবং সেই সময়ে কল করতে পারে activation_hook!

register_post_type()দেখার মতো পুনর্লিখনের নিয়মগুলি যেমন তৈরি হয় তার উপর নির্ভরতা কীভাবে if(strpos($key, $args['rewrite']['slug'] ) === 0)আরও কিছু বিস্তৃত অর্থাত্ নিয়মিত প্রকাশের মাধ্যমে পরীক্ষার পরিবর্তে হ্রাস করা যায় ।

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