ওয়ার্ডপ্রেসে কাস্টম প্লাগইন রুট


12

ঠিক আছে তাই আমার প্রশ্নটি বেশ সহজ। আমার প্লাগইনটির জন্য আমাকে কিছু কাস্টম রাউটিং বিধি প্রয়োগ করতে হবে। এই রুটগুলিতে কেবল একটি যুক্তি নেওয়া হবে (তাই জটিল কিছু নয়) এবং দেখতে এই জাতীয়: http://www.example.org/myroute/myargument

এবং আদর্শভাবে, এটি একটি কাস্টম ক্লাস কল করবে এবং একটি কাস্টম টেম্পলেট প্রদর্শন করবে (যা সরাসরি শ্রেণিতে অ্যাক্সেস করতে পারে)।

এর জন্য সর্বোত্তম পন্থা কী? চিয়ার্স

উত্তর:


15

আপনার তিনটি গুরুত্বপূর্ণ কাজ করা দরকার:

  1. ইউআরআইয়ের অংশগুলিকে রূপান্তরিত মানগুলিতে রূপান্তর করতে একটি কাস্টম পুনর্লিখনের নিয়ম তৈরি করুন index.php
  2. ওয়ার্ডপ্রেসের ক্যোয়ারী ভেরিয়েবলগুলি শ্বেত তালিকাতে যুক্ত করুন myrouteএবং যুক্ত করুন myargument, যাতে ওয়ার্ডপ্রেসগুলি যখন কোনও কোয়েরি স্ট্রিংয়ের সাথে উপস্থিত হয় তখন কেবল তাদের এড়িয়ে যায় না।
  3. পুনর্লিখনের নিয়মগুলি ফ্লাশ করুন।

প্রথমত, আমি সুপারিশ করতে যাচ্ছি এর পরিবর্তে http://www.example.org/myroute/myargument, আপনি যখন ইউআরআইকে এই বিশেষ 'রুটগুলির মধ্যে একটি হিসাবে বিবেচনা করা উচিত তখন নির্দিষ্ট কিছু উপসর্গ বা প্রত্যয় স্থির করে নিন। এই উদাহরণের জন্য, আমি উপসর্গটি বেছে নিয়েছি api, যাতে এটি হয় http://www.example.org/api/myroute/myargument। আমি বেছে নিয়েছিলাম apiকারণ যখন আমি কিছু বিশ্রামের কাজ করেছি, যেমনটি আপনি কাজ করছেন বলে মনে হয়, তখন এটি একটি এপিআইয়ের জন্য ছিল।

কোড

add_filter( 'rewrite_rules_array', 'my_insert_rewrite_rules' );
add_filter( 'query_vars', 'my_insert_query_vars' );
add_action( 'wp_loaded', 'my_flush_rules' );

// flush_rules() if our rules are not yet included
function my_flush_rules() {
    $rules = get_option( 'rewrite_rules' );

    if ( ! isset( $rules['api/(.*?)/(.+?)'] ) ) {
        global $wp_rewrite;
        $wp_rewrite->flush_rules();
    }
}

// Adding a new rule
function my_insert_rewrite_rules( $rules ) {
    $newrules = array();
    $newrules['api/(.*?)/(.+?)'] = 'index.php?myroute=$matches[1]&myargument=$matches[2]';
    return $newrules + $rules;
}

// Adding the id var so that WP recognizes it
function my_insert_query_vars( $vars ) {
    array_push( $vars, 'myroute', 'myargument' );
    return $vars;
}

দ্রুত ব্রেকডাউন

এটি সব মোটামুটি সোজা এগিয়ে। রেগেক্স প্যাটার্নটি ওয়ার্ডপ্রেসের সমস্ত পুনর্লিখনের নিয়মের তালিকায় যুক্ত হয়েছে এবং আপনার কাস্টম প্যাটার্ন তালিকার শীর্ষে রয়েছে। প্যাটার্নটি মিলে গেলে, ওয়ার্ডপ্রেস পুনর্লিখনের নিয়মগুলির তালিকাগুলি সন্ধান করা বন্ধ করবে $matches[1]এবং $matches[2]কোয়েরি স্ট্রিংয়ে রেফারেন্সের ( এবং ) রেফারেন্সের জায়গায় রেগেক্সের ধরা পড়া মানগুলি ব্যবহার করবে index.php

ক্যোয়ারী ভেরিয়েবলগুলি myrouteএবং myargumentশ্বেত তালিকাতে যুক্ত করা কেবল ওয়ার্ডপ্রেসকে এড়িয়ে যাওয়ার চেয়ে তাদের প্রতি মনোযোগ দেয়।

আপনার কাস্টম রুটটিকে 'নেমস্পেসিং' করার বিকল্প উপায়

আপনি যদি /api/উপসর্গ হিসাবে ব্যবহার এড়াতে চান , আপনি পরিবর্তে কোয়েরি স্ট্রিং ভেরিয়েবল / ক্ষেত্র ব্যবহার করতে পারেন। এরকম কিছু করার জন্য, আপনি রেজিটাকে এমন কিছুতে পরিবর্তন করতে হবে (.*?)/(.+?)\\?api=1এবং তারপরে কলটিতে apiঅতিরিক্ত প্যারামিটার হিসাবে যুক্ত করবে ।array_push()my_insert_query_vars()

এটি কাস্টম রুটকে পরিবর্তন করবে যাতে এটি যে কোনও সময় ট্রিগার করে তোলে api=1ক্যোয়ারী স্ট্রিংয়ের প্রথম উপাদান, যেমন এটি ট্রিগার করবে http://example.com/anytext/anytext?api=1

'নেমস্পেসিং' শব্দটির ব্যবহার উপেক্ষা করুন - এটি কেবল ব্রেভিটির জন্য ব্যবহৃত হয়েছিল।

আপনি যদি উপসর্গ বা প্রত্যয় দিয়ে 'নেমস্পেস' না করেন তবে ইউআরআই নিদর্শনগুলির সাথে সংঘাতের সমাপ্তি ঘটবে। এটি কারণ হ'ল ওয়ার্ডপ্রেসের কোনও পোস্ট বা পৃষ্ঠা হওয়ার উদ্দেশ্যে আপনার কাস্টম প্যাটার্নটিকে আলাদা করার কোনও উপায় নেই। ওয়ার্ডপ্রেস কীভাবে জানবে যে myrouteএটি কোনও শ্রেণীবদ্ধ, পদ বা কোনও পিতামাতার পৃষ্ঠা নয়?

আশাকরি এটা সাহায্য করবে.


1
সহজ নোট: my_insert_rewrite_rulesসংজ্ঞা অনুসারে নিয়ম সংজ্ঞায়িত ! প্রথমে দীর্ঘতম নিয়মটি দিয়ে শুরু করুন তারপরে সহজতমটিতে কাজ করুন, অন্যথায় / এপিআই / মাইরোট / এপিআই / মাইরোট / মায়ারগমেন্টটি ওভাররাইড হবে।
emc

1
@npc কাস্টম পুনর্লিখনের নিয়ম তৈরি করার সময় সচেতন হওয়ার জন্য একটি গুরুত্বপূর্ণ বিষয়টি জানায়, তারা সেভাবে সংঘর্ষও করতে পারে। উপরের উদাহরণে যদিও, এটি কোনও সমস্যা নয় কারণ / এপিআই / মাইরোট কেবল বৈধ পথ হবে না।
এডিমেমায়া

যখনই উদাহরণ . org/api/myroute/myargument পৃষ্ঠাটির অনুরোধ করা হয়েছিল তখনই কেউ কীভাবে তাদের প্লাগইন ডিরেক্টরি থেকে একটি কাস্টম টেম্পলেট লোড করতে পারে ?
ম্যাট কীগুলি

1
এখানে ওয়ার্ডপ্রেসের আসল এবং সম্পূর্ণ সমাধানটি রয়েছে: কোডেক্স.ওয়ার্ডপ্রেস.আর
ইমরান জহুর

6

উপরে এডিমেমায় কী করেছে তার কিছুটা প্রসারিত করতে:

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

কাস্টম টেম্পলেটটি যে কোনও জায়গায় অবস্থিত হতে পারে, আমার ক্ষেত্রে এটি প্লাগইন ডিরেক্টরিতে সঞ্চিত রয়েছে।

আমি কেবল যাচাইয়ের নিয়মগুলি প্লাগইন অ্যাক্টিভেশন চলাকালীন ফ্লাশ করার প্রয়োজন ছিল কিনা তা যাচাই করতে চেয়েছিলাম, তাই আমি এটি একটি রেজিস্টার_অ্যাক্টিভেশন_হুক এ রেখেছি

আমি যা করেছি তার পুরো উদাহরণের জন্য নীচে দেখুন:

মিলোর পরামর্শের ভিত্তিতে আপডেট করা সহজ হয়েছে

class Your_Class
{

    public function init()
    {
        add_filter( 'template_include', array( $this, 'include_template' ) );
        add_filter( 'init', array( $this, 'rewrite_rules' ) );
    }

    public function include_template( $template )
    {
        //try and get the query var we registered in our query_vars() function
        $account_page = get_query_var( 'account_page' );

        //if the query var has data, we must be on the right page, load our custom template
        if ( $account_page ) {
            return PATH_TO_PLUGIN_TEMPLATES_DIR . 'register.php';
        }

        return $template;
    }

    public function flush_rules()
    {
        $this->rewrite_rules();

        flush_rewrite_rules();
    }

    public function rewrite_rules()
    {
        add_rewrite_rule( 'account/(.+?)/?$', 'index.php?account_page=$matches[1]', 'top');
        add_rewrite_tag( '%account_page%', '([^&]+)' );
    }

}

add_action( 'plugins_loaded', array( new Your_Class, 'init' ) );

// One time activation functions
register_activation_hook( PATH_TO_PLUGIN_FILE, array( new Your_Class, 'flush_rules' ) );

1
আপনি কেবল ব্যবহার করতে পারেন add_rewrite_endpoint, যা আপনার জন্য নিয়ম তৈরি করে এবং একসাথে ক্যোয়ারী ভার যোগ করবে। এছাড়াও আপনি যদি নিজের নিজের পুনর্লিখনের নিয়ম যুক্ত করে থাকেন তবে আমি add_rewrite_ruleফিল্টারিংয়ের পরিবর্তে ফাংশনটির পরামর্শ দিচ্ছি rewrite_rules_array
মিলো

ধন্যবাদ মিলো, আমি পুনরায় লেখার অ্যারে ফিল্টার না করে add_rewrite_rule ব্যবহার করার জন্য কোডটি আপডেট করেছি। আমি অ্যাড_উরাইট_অ্যান্ডপয়েন্টের দিকে তাকিয়েছি তবে আমি মনে করি অ্যাড_উরাইট_ট্যাগটি আমার প্রয়োজনের জন্য আরও ভাল ফিট হতে পারে। দেখে মনে হচ্ছে অ্যাড_উরাইট_এন্ডপয়েন্টটি বেশিরভাগই কার্যকর যদি আপনি বিদ্যমান ডাব্লুপি পুনরায় লেখায় অতিরিক্ত যুক্তি যুক্ত করতে চান। আমি এখানে ভুল হলে আমাকে সংশোধন করুন।
ম্যাট কীগুলি

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