আপনি কীভাবে ওয়ার্ডপ্রেসে একটি "ভার্চুয়াল" পৃষ্ঠা তৈরি করবেন


52

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

উদাহরণ:
http://mysite.com/my-api.php=>http://mysite.com/wp-content/plugins/my-plugin/my-api.php

এর মূল বক্তব্যটি হ'ল এপিআই শেষ পয়েন্টের জন্য ইউআরএলটিকে যতটা সম্ভব সংক্ষিপ্ত করে তুলুন ( http://mysite.com/xmlrpc.phpব্যবহারকারীকে তাদের ইনস্টলেশন এবং / অথবা হ্যাক কোরের মধ্যে ফাইলগুলি চারপাশে সরিয়ে নেওয়ার চেয়ে প্লাগ-ইন দিয়ে প্রকৃত এপিআই এন্ডপয়েন্ট ফাইলটি প্রেরণের অনুরূপ) ।

আমার প্রথম ছুরিকাঘাতটি একটি কাস্টম পুনর্লিখনের নিয়ম যুক্ত করা ছিল। তবে এতে দুটি সমস্যা ছিল।

  1. শেষের পয়েন্টটিতে সর্বদা একটি পিছনের স্ল্যাশ ছিল। এটা হয়ে ওঠেhttp://mysite.com/my-api.php/
  2. আমার পুনর্লিখনের নিয়মটি কেবলমাত্র আংশিকভাবে প্রয়োগ হয়েছিল। এটি পুনর্নির্দেশ করবে না wp-content/plugins..., এটি পুনর্নির্দেশ করবে index.php&wp-content/plugins...। এটি ওয়ার্ডপ্রেসকে নেতৃত্ব দেয় যা কোনও পৃষ্ঠাতে ত্রুটি খুঁজে পাওয়া যায়নি বা কেবল হোমপেজে ডিফল্ট হয়।

ধারনা? পরামর্শ?

উত্তর:


55

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

বাহ্যিক বিধি:

বাহ্যিক নিয়মটি সেট আপ করা এবং অনুসরণ করা সহজ। এটি my-api.phpওয়ার্ডপ্রেস থেকে কোনও লোড না করেই আপনার প্লাগইন ডিরেক্টরিতে কার্যকর করা হবে ।

add_action( 'init', 'wpse9870_init_external' );
function wpse9870_init_external()
{
    global $wp_rewrite;
    $plugin_url = plugins_url( 'my-api.php', __FILE__ );
    $plugin_url = substr( $plugin_url, strlen( home_url() ) + 1 );
    // The pattern is prefixed with '^'
    // The substitution is prefixed with the "home root", at least a '/'
    // This is equivalent to appending it to `non_wp_rules`
    $wp_rewrite->add_external_rule( 'my-api.php$', $plugin_url );
}

অভ্যন্তরীণ বিধি:

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

add_action( 'init', 'wpse9870_init_internal' );
function wpse9870_init_internal()
{
    add_rewrite_rule( 'my-api.php$', 'index.php?wpse9870_api=1', 'top' );
}

add_filter( 'query_vars', 'wpse9870_query_vars' );
function wpse9870_query_vars( $query_vars )
{
    $query_vars[] = 'wpse9870_api';
    return $query_vars;
}

add_action( 'parse_request', 'wpse9870_parse_request' );
function wpse9870_parse_request( &$wp )
{
    if ( array_key_exists( 'wpse9870_api', $wp->query_vars ) ) {
        include 'my-api.php';
        exit();
    }
    return;
}

3
আমি কেবল এটি যুক্ত করতে চাই যে পারমালিনিক্স পৃষ্ঠায় যেতে এবং ডাব্লুপি-অ্যাডমিনের "পরিবর্তনগুলি সংরক্ষণ করুন" এ ক্লিক করা তার গুরুত্বপূর্ণ। আমার এক ঘণ্টা ধরে এই ভাবছিলাম যে আমাকে পারমিলিকগুলি রিফ্রেশ করা দরকার ছিল ... যদি না কেউ এমন কোনও ফাংশন জানেন যা এটি করতে পারে?
ইথানপিল

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

1
কাজ করে, তবে get_query_vars()আমার-এপিআইপিপি-তে কোনও পাস করা ক্যোয়ারী ভেরিয়েবল অ্যাক্সেস করার মতো মনে হচ্ছে না । কোন ভেরিয়েবল লোড করা হয়েছে তা আমি পরীক্ষা করে দেখলাম। এবং একমাত্র ভের সেট করা হয় আ WP object$wp। আমি কীভাবে এটিতে কোনও অ্যাক্সেস বা ট্রান্সফর্ম WP_Queryকরব যাতে আমি পাসকৃত ভেরিয়েবলগুলি অ্যাক্সেস করতে পারি get_query_vars()?
জুলে

1
@ জুলস: আপনি যখন includeফাইল করেন, এটি বর্তমান স্কোপেই কার্যকর হয়। এই ক্ষেত্রে এটি wpse9870_parse_requestফাংশন, যার কেবলমাত্র $wpপ্যারামিটার রয়েছে। এটি সম্ভব যে বিশ্বব্যাপী $wp_queryএই মুহূর্তে সেট করা হয়নি, সুতরাং get_query_var()কাজ করবে না। যাইহোক, আপনি ভাগ্যবান: আপনার প্রয়োজন $wpএমন query_varsসদস্যটি এমন শ্রেণি যা আমি প্রয়োজন - আমি এটি উপরের কোডটিতে নিজেই ব্যবহার করি।
জান ফ্যাব্রি

1
একটি বাহ্যিক পুনর্লিখনের নিয়ম তৈরি করার চেষ্টা করছি। কোডের আপনার মুষ্টি টুকরা যোগ কিন্তু আমি এখনও 404. পাচ্ছি রাঙা লেখা নিয়ম: BTW
শিশির

12

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

এই কোডটি কেবল একটি প্লাগইনে ফেলে দিন এবং "ট্যাকো-কিটেনস.এফপি" নামক ফাইলটি সরাসরি প্লাগইন ফোল্ডারে আপলোড করুন। আপনার পারমালিঙ্কগুলির জন্য আপনাকে একটি হার্ড ফ্লাশ লিখতে হবে। আমি মনে করি তারা বলছেন যে এটি করার সর্বোত্তম সময়টি প্লাগইন অ্যাক্টিভেশন।

function taco_kitten_rewrite() {
    $url = str_replace( trailingslashit( site_url() ), '', plugins_url( '/taco-kittens.php', __FILE__ ) );
    add_rewrite_rule( 'taco-kittens\\.php$', $url, 'top' );
}
add_action( 'wp_loaded', 'taco_kitten_rewrite' );

শুভেচ্ছা, মাইক


1
এই কোডটি চেষ্টা করার সময় আমি একটি অ্যাক্সেস অস্বীকার ত্রুটি পেয়েছি। আমার সন্দেহ হয় যে আমার সার্ভার বা ডাব্লুপি সম্পূর্ণরূপে URL পছন্দ করে না। এই, অপরপক্ষে, জরিমানা কাজ:add_rewrite_rule( 'taco-kittens', 'wp-content/plugins/taco-kittens.php', 'top' );
জুলে

আপনি কি দয়া করে আমাকে জানান, টাকো-বিড়ালছানা.এফপিতে আমার কী রাখা উচিত, আমার কাছে .htaccess বা url পুনর্লিখনের জ্ঞান নেই।
প্রফুল্ল কুমার সাহু

9

পরিবর্তে এরকম কিছু না করার কোনও কারণ?

http://mysite.com/?my-api=1

তারপরে আপনার প্লাগইনটিকে 'init' এ টানুন এবং সেই পরিবর্তনশীলটি পরীক্ষা করুন। যদি এটি বিদ্যমান থাকে তবে আপনার প্লাগইনটি যা করতে হবে তা করুন এবং মারা যান ()


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

আপনি যদি পুনরায় লেখালেখি করে রেখেছিলেন তবে এটি জিইটি ভারতে আবার লিখেছেন? রোবটস টেক্সট-এর পুনর্লিখন কীভাবে কাজ করে তা আপনিও দেখতে পারেন। এটি আপনাকে কীভাবে আমার- api.php /
অ্যান্ডারসন

আপনি যদি এপিআই কলগুলির মতো রোবটগুলিকে যত্ন না করেন তবে এটি নিখুঁত সমাধান।
beytarovski

4

আমি আপনার প্রশ্নগুলি পুরোপুরি বুঝতে পারছি না, তবে কোনও সাধারণ শর্টকোড আপনার সমস্যা সমাধান করবে?

পদক্ষেপ:

  1. ক্লায়েন্টকে একটি পৃষ্ঠা তৈরি করতে বলুন যেমন http://mysite.com/my-api
  2. ক্লায়েন্টকে সেই পৃষ্ঠাতে একটি শর্টকোড যুক্ত করুন ([আমার-এপিআই-শর্টকোড]

নতুন পৃষ্ঠাটি একটি এপিআই শেষ পয়েন্ট হিসাবে কাজ করে এবং আপনার শর্টকোড http://mysite.com/wp-content/plugins/my-plugin/my-api.php এ আপনার প্লাগইন কোডে অনুরোধগুলি প্রেরণ করে

(অবশ্যই এর অর্থ হ'ল আমার- api.php এর সংক্ষিপ্ত সংজ্ঞা থাকবে)

আপনি সম্ভবত প্লাগইনটির মাধ্যমে 1 এবং 2 পদক্ষেপ স্বয়ংক্রিয় করতে পারেন।


1

আমি এখনও এতটা নতুন করে লিখতে পারি নি, তবে এটি সম্ভবত কিছুটা মোটামুটি, তবে মনে হচ্ছে এটি কার্যকর হবে:

function api_rewrite($wp_rewrite) {
    $wp_rewrite->non_wp_rules['my-api\.php'] = 'wp-content/plugins/my-plugin/my-api.php';
    file_put_contents(ABSPATH.'.htaccess', $wp_rewrite->mod_rewrite_rules() );
}

আপনি যদি এটি 'জেনারেট_উইরাইট_রুলস'-এ সংযুক্ত করেন তবে এটি কাজ করে তবে এর চেয়ে ভাল আরও একটি উপায় থাকতে হবে, কারণ আপনি প্রতিটি পৃষ্ঠার লোডটিতে .htaccess আবার লিখতে চান না।
দেখে মনে হচ্ছে আমি নিজের পোস্টগুলি সম্পাদনা বন্ধ করতে পারি না ... এটির পরিবর্তে আপনার কলব্যাকটি সক্রিয়করণ এবং গ্লোবাল reference wp_rewrite উল্লেখের পরিবর্তে সম্ভবত প্রবেশ করা উচিত। এবং তারপরে আপনার কলব্যাক নিষ্ক্রিয় করে আবার নন_ডাব্লু_আরুলস এবং আউটপুট থেকে .htaccess এ এন্ট্রি সরান।

এবং পরিশেষে, .htaccess এ লেখাটি কিছুটা পরিশীলিত হওয়া উচিত, আপনি কেবল সেখানে ওয়ার্ডপ্রেস বিভাগটি প্রতিস্থাপন করতে চান।


1

আমার অনুরূপ প্রয়োজনীয়তা ছিল এবং অনন্য স্লাগগুলির উপর ভিত্তি করে বেশ কয়েকটি শেষ-পয়েন্ট তৈরি করতে চেয়েছিলাম যা প্লাগইন দ্বারা উত্পাদিত সামগ্রীকে নির্দেশ করে।

আমার প্লাগইনটির উত্সটি একবার দেখুন: https://wordpress.org/extend/plugins/picasa-album-uploader/

আমি যে কৌশলটি ব্যবহার করেছি the_postsতা আগত অনুরোধটি পরীক্ষা করার জন্য একটি ফিল্টার যুক্ত করে শুরু হয় । যদি প্লাগইন এটি পরিচালনা করে তবে একটি ডামি পোস্ট উত্পন্ন হয় এবং এর জন্য একটি ক্রিয়া যুক্ত করা হয় template_redirect

template_redirectক্রিয়াকলাপটি যখন বলা হয়, তখন অবশ্যই পৃষ্ঠার পুরো বিষয়বস্তু প্রদর্শিত হতে এবং প্রস্থান করার জন্য ফলাফল আউটপুট করতে হবে অথবা এটি কোনও আউটপুট উত্পন্ন না করে ফিরে আসতে হবে। কোডটি দেখুন wp_include/template-loader.phpএবং আপনি কেন তা দেখতে পাবেন।


1

আমি অন্য পদ্ধতির মধ্যে গঠিত যা ব্যবহার করছি একটি কাস্টম শিরোনাম, বিষয়বস্তু এবং পৃষ্ঠা টেমপ্লেট লোড করতে হোম পেজে অত্যাচার

সমাধানটি খুব ঝরঝরে তাই এটি প্রয়োগ করা যেতে পারে যখন কোনও ব্যবহারকারী বন্ধুত্বপূর্ণ লিঙ্ক যেমন http://example.com/ ? প্লাগইন_পেজ = মাইফেকপেজ অনুসরণ করে

এটি প্রয়োগ করা খুব সহজ এবং সীমাহীন পৃষ্ঠাগুলির জন্য অনুমতি দেওয়া উচিত।

কোড এবং নির্দেশাবলী এখানে: ফ্লাইতে একটি কাস্টম / নকল / ভার্চুয়াল ওয়ার্ডপ্রেস পৃষ্ঠা উত্পন্ন করুন


0

আমি জাভি এস্তেভের উপরের অনুরূপ একটি পন্থা ব্যবহার করছি, যা ওয়ার্ডপ্রেস আপগ্রেডের কারণে কাজ করা বন্ধ করে দিয়েছিল যতদূর আমি 2013 এর দ্বিতীয়ার্ধে বলতে পারি।

এটি এখানে বিশদ বিবরণে নথিভুক্ত করা হয়েছে: https://stackoverflow.com/questions/17960649/wordpress-plugin-generating-virtual-pages-and- using-theme-template

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


0

এটি প্রোডাকশন রিডির উদাহরণ, প্রথমে ভার্চুয়াল পৃষ্ঠা শ্রেণি তৈরি করুন:


class VirtualPage
{

    private $query;
    private $title;
    private $content;
    private $template;
    private $wp_post;

    function __construct($query = '/index2', $template = 'page', $title = 'Untitled')
    {
        $this->query = filter_var($query, FILTER_SANITIZE_URL);
        $this->setTemplate($template);
        $this->setTitle($title);
    }

    function getQuery()
    {
        return $this->query;
    }

    function getTemplate()
    {
        return $this->template;
    }

    function getTitle()
    {
        return $this->title;
    }

    function setTitle($title)
    {
        $this->title = filter_var($title, FILTER_SANITIZE_STRING);

        return $this;
    }

    function setContent($content)
    {
        $this->content = $content;

        return $this;
    }

    function setTemplate($template)
    {
        $this->template = $template;

        return $this;
    }

    public function updateWpQuery()
    {

        global $wp, $wp_query;

        // Update the main query
        $wp_query->current_post = $this->wp_post->ID;
        $wp_query->found_posts = 1;
        $wp_query->is_page = true;//important part
        $wp_query->is_singular = true;//important part
        $wp_query->is_single = false;
        $wp_query->is_attachment = false;
        $wp_query->is_archive = false;
        $wp_query->is_category = false;
        $wp_query->is_tag = false;
        $wp_query->is_tax = false;
        $wp_query->is_author = false;
        $wp_query->is_date = false;
        $wp_query->is_year = false;
        $wp_query->is_month = false;
        $wp_query->is_day = false;
        $wp_query->is_time = false;
        $wp_query->is_search = false;
        $wp_query->is_feed = false;
        $wp_query->is_comment_feed = false;
        $wp_query->is_trackback = false;
        $wp_query->is_home = false;
        $wp_query->is_embed = false;
        $wp_query->is_404 = false;
        $wp_query->is_paged = false;
        $wp_query->is_admin = false;
        $wp_query->is_preview = false;
        $wp_query->is_robots = false;
        $wp_query->is_posts_page = false;
        $wp_query->is_post_type_archive = false;
        $wp_query->max_num_pages = 1;
        $wp_query->post = $this->wp_post;
        $wp_query->posts = array($this->wp_post);
        $wp_query->post_count = 1;
        $wp_query->queried_object = $this->wp_post;
        $wp_query->queried_object_id = $this->wp_post->ID;
        $wp_query->query_vars['error'] = '';
        unset($wp_query->query['error']);

        $GLOBALS['wp_query'] = $wp_query;

        $wp->query = array();
        $wp->register_globals();

    }

    public function createPage()
    {
        if (is_null($this->wp_post)) {
            $post = new stdClass();
            $post->ID = -99;
            $post->ancestors = array(); // 3.6
            $post->comment_status = 'closed';
            $post->comment_count = 0;
            $post->filter = 'raw';
            $post->guid = home_url($this->query);
            $post->is_virtual = true;
            $post->menu_order = 0;
            $post->pinged = '';
            $post->ping_status = 'closed';
            $post->post_title = $this->title;
            $post->post_name = sanitize_title($this->template); // append random number to avoid clash
            $post->post_content = $this->content ?: '';
            $post->post_excerpt = '';
            $post->post_parent = 0;
            $post->post_type = 'page';
            $post->post_status = 'publish';
            $post->post_date = current_time('mysql');
            $post->post_date_gmt = current_time('mysql', 1);
            $post->modified = $post->post_date;
            $post->modified_gmt = $post->post_date_gmt;
            $post->post_password = '';
            $post->post_content_filtered = '';
            $post->post_author = is_user_logged_in() ? get_current_user_id() : 0;
            $post->post_content = '';
            $post->post_mime_type = '';
            $post->to_ping = '';

            $this->wp_post = new WP_Post($post);
            $this->updateWpQuery();

            @status_header(200);
            wp_cache_add(-99, $this->wp_post, 'posts');

        }


        return $this->wp_post;
    }
}

পরবর্তী পদক্ষেপে হুক template_redirectক্রিয়াতে এবং নীচের মতো আপনার ভার্চুয়াল পৃষ্ঠাটি পরিচালনা করুন

    add_action( 'template_redirect', function () {


                    switch ( get_query_var( 'name' ,'') ) {

                        case 'contact':
                            // http://yoursite/contact  ==> loads page-contact.php
                            $page = new VirtualPage( "/contact", 'contact',__('Contact Me') );
                            $page->createPage();
                            break;

                        case 'archive':
                            // http://yoursite/archive  ==> loads page-archive.php
                            $page = new VirtualPage( "/archive", 'archive' ,__('Archives'));
                            $page->createPage();
                            break;

                        case 'blog':
                            // http://yoursite/blog  ==> loads page-blog.php
                            $page = new VirtualPage( "/blog", 'blog' ,__('Blog'));
                            $page->createPage();
                            break;


                }


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