প্লাগইন সহ কাস্টম পৃষ্ঠাগুলি


13

আমি এমন কিছু প্লাগইন বিকাশ করছি যেখানে আমি কাস্টম পৃষ্ঠাগুলি সক্ষম করতে চাই। আমার ক্ষেত্রে কিছু কাস্টম পৃষ্ঠায় যোগাযোগ ফর্মের মতো একটি ফর্ম থাকবে (আক্ষরিকভাবে নয়)। যখন ব্যবহারকারী এই ফর্মটি পূরণ করবেন এবং এটি প্রেরণ করবেন তখন পরবর্তী পদক্ষেপ থাকা উচিত যার জন্য আরও তথ্যের প্রয়োজন হবে। বলুন যে ফর্ম সহ প্রথম পৃষ্ঠাটি www.domain.tld/custom-page/সফল ফর্ম জমা দেওয়ার সময় এবং পরে অবস্থিত হবে , ব্যবহারকারীকে পুনঃনির্দেশ করা উচিত www.domain.tld/custom-page/second। এইচটিএমএল উপাদান এবং পিএইচপি কোড সহ টেমপ্লেটটিও কাস্টম হওয়া উচিত।

আমি মনে করি যে সমস্যাটির একটি অংশ কাস্টম ইউআরএল পুনরায় লেখার মাধ্যমে অর্জন করা সম্ভব তবে অন্যান্য অংশগুলি বর্তমানে আমার অজানা। আমি কোথায় জানি শুরু করা উচিত এবং সেই সমস্যার সঠিক নামকরণ কী তা সত্যই আমি জানি না। কোন সাহায্যের সত্যিই প্রশংসা করা হবে.


আপনি কি চান যে এই পৃষ্ঠাগুলি ওয়ার্ডপ্রেস বা 'ভার্চুয়াল' এ সঞ্চয় করা হোক?
ওয়েলচার

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

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

আপনি কি ইনপুট ক্ষেত্রে একাধিক স্লাইড (জাভাস্ক্রিপ্ট এবং / অথবা সিএসএস) সহ একটি একক পৃষ্ঠা ফর্ম ব্যবহার বিবেচনা করেছেন?
বার্জায়ার

উত্তর:


57

আপনি যখন কোনও ফ্রন্টএন্ড পৃষ্ঠাতে যান, তখন ওয়ার্ডপ্রেস ডাটাবেসটিকে জিজ্ঞাসা করবে এবং যদি আপনার পৃষ্ঠাটি ডাটাবেসে উপস্থিত না থাকে, তবে সেই ক্যোয়ারির প্রয়োজন হয় না এবং এটি কেবল সম্পদের অপচয়।

ভাগ্যক্রমে, ওয়ার্ডপ্রেস একটি কাস্টম উপায়ে সম্মুখভাগ অনুরোধগুলি পরিচালনা করার জন্য একটি উপায় সরবরাহ করে। যে 'do_parse_request'ফিল্টার ধন্যবাদ করা হয় ।

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

এটি বলেছিল, আমি একটি সাধারণ ওওপি প্লাগইন তৈরির এমন একটি উপায় ভাগ করতে চাই যা ভার্চুয়াল পৃষ্ঠাগুলিকে সহজেই ব্যবহারযোগ্য (এবং পুনরায় ব্যবহার) উপায়ে পরিচালনা করতে পারে।

আমাদের কি দরকার

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

ইন্টারফেস

ক্লাস তৈরির আগে, উপরের তালিকাভুক্ত 3 টি অবজেক্টের জন্য ইন্টারফেস লিখি।

প্রথম পৃষ্ঠা ইন্টারফেস (ফাইল PageInterface.php):

<?php
namespace GM\VirtualPages;

interface PageInterface {

    function getUrl();

    function getTemplate();

    function getTitle();

    function setTitle( $title );

    function setContent( $content );

    function setTemplate( $template );

    /**
     * Get a WP_Post build using virtual Page object
     *
     * @return \WP_Post
     */
    function asWpPost();
}

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

নিয়ামক ইন্টারফেস (ফাইল ControllerInterface.php):

<?php
namespace GM\VirtualPages;

interface ControllerInterface {

    /**
     * Init the controller, fires the hook that allows consumer to add pages
     */
    function init();

    /**
     * Register a page object in the controller
     *
     * @param  \GM\VirtualPages\Page $page
     * @return \GM\VirtualPages\Page
     */
    function addPage( PageInterface $page );

    /**
     * Run on 'do_parse_request' and if the request is for one of the registered pages
     * setup global variables, fire core hooks, requires page template and exit.
     *
     * @param boolean $bool The boolean flag value passed by 'do_parse_request'
     * @param \WP $wp       The global wp object passed by 'do_parse_request'
     */  
    function dispatch( $bool, \WP $wp ); 
}

এবং টেমপ্লেট লোডার ইন্টারফেস (ফাইল TemplateLoaderInterface.php):

<?php
namespace GM\VirtualPages;

interface TemplateLoaderInterface {

    /**
     * Setup loader for a page objects
     *
     * @param \GM\VirtualPagesPageInterface $page matched virtual page
     */
    public function init( PageInterface $page );

    /**
     * Trigger core and custom hooks to filter templates,
     * then load the found template.
     */
    public function load();
}

এই ইন্টারফেসের জন্য পিএইচপিডোকের মন্তব্যগুলি বেশ পরিষ্কার হওয়া উচিত।

পরিকল্পনা

এখন আমাদের ইন্টারফেস রয়েছে এবং কংক্রিটের ক্লাস লেখার আগে আসুন আমাদের কর্মপ্রবাহটি পর্যালোচনা করুন:

  • প্রথমে আমরা একটি Controllerক্লাস ইনস্ট্যান্ট করি (বাস্তবায়নকারী ControllerInterface) এবং ইনজেকশন (সম্ভবত কোনও নির্মাণকারী) TemplateLoaderক্লাসের একটি উদাহরণ (প্রয়োগকারী TemplateLoaderInterface)
  • উপর initহুক আমরা কল ControllerInterface::init()সেটআপ পদ্ধতি কন্ট্রোলার এবং হুক যা ভোক্তা কোড ভার্চুয়াল পৃষ্ঠাগুলি যোগ করার জন্য ব্যবহার করা হবে আগুনে।
  • উপর 'do_parse_request' আমরা ডাকব ControllerInterface::dispatch(), এবং আমরা সবাই ভার্চুয়াল পৃষ্ঠাগুলি যোগ চেক করবে এবং যদি তাদের মধ্যে একজন বর্তমান অনুরোধের একই URL আছে, এটা প্রদর্শন; সমস্ত মূল বৈশ্বিক চলক ( $wp_query, $post) সেট করার পরে । আমরা TemplateLoaderসঠিক টেমপ্লেট লোড করতে শ্রেণিও ব্যবহার করব ।

এই ওয়ার্কফ্লোটি আমরা কিছু কোর আঙ্গুলসমূহ আরম্ভ হবে সময়, মত wp, template_redirect, template_include... প্লাগইন নমনীয় করতে এবং কোর এবং অন্যান্য প্লাগিন, অথবা তাদের একটি ভাল নম্বর দিয়ে অন্তত সাথে সামঞ্জস্যের নিশ্চিত করতে হবে।

পূর্ববর্তী ওয়ার্কফ্লো বাদে আমাদেরও এগুলি করতে হবে:

  • মূল এবং তৃতীয় পক্ষের কোডের সাথে সামঞ্জস্যতা উন্নত করতে আবার প্রধান লুপ রান হওয়ার পরে হুক এবং গ্লোবাল ভেরিয়েবলগুলি পরিষ্কার করুন
  • the_permalinkযখন প্রয়োজন হয় তখন ডান ভার্চুয়াল পৃষ্ঠা URL ফিরিয়ে আনতে একটি ফিল্টার যুক্ত করুন ।

কংক্রিট ক্লাস

এখন আমরা আমাদের কংক্রিট ক্লাস কোড করতে পারি। আসুন পৃষ্ঠার শ্রেণি (ফাইল Page.php) দিয়ে শুরু করুন :

<?php
namespace GM\VirtualPages;

class Page implements PageInterface {

    private $url;
    private $title;
    private $content;
    private $template;
    private $wp_post;

    function __construct( $url, $title = 'Untitled', $template = 'page.php' ) {
        $this->url = filter_var( $url, FILTER_SANITIZE_URL );
        $this->setTitle( $title );
        $this->setTemplate( $template);
    }

    function getUrl() {
        return $this->url;
    }

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

    function asWpPost() {
        if ( is_null( $this->wp_post ) ) {
            $post = array(
                'ID'             => 0,
                'post_title'     => $this->title,
                'post_name'      => sanitize_title( $this->title ),
                'post_content'   => $this->content ? : '',
                'post_excerpt'   => '',
                'post_parent'    => 0,
                'menu_order'     => 0,
                'post_type'      => 'page',
                'post_status'    => 'publish',
                'comment_status' => 'closed',
                'ping_status'    => 'closed',
                'comment_count'  => 0,
                'post_password'  => '',
                'to_ping'        => '',
                'pinged'         => '',
                'guid'           => home_url( $this->getUrl() ),
                'post_date'      => current_time( 'mysql' ),
                'post_date_gmt'  => current_time( 'mysql', 1 ),
                'post_author'    => is_user_logged_in() ? get_current_user_id() : 0,
                'is_virtual'     => TRUE,
                'filter'         => 'raw'
            );
            $this->wp_post = new \WP_Post( (object) $post );
        }
        return $this->wp_post;
    }
}

ইন্টারফেস বাস্তবায়ন ছাড়া আর কিছুই নয়।

এখন নিয়ামক শ্রেণি (ফাইল Controller.php):

<?php
namespace GM\VirtualPages;

class Controller implements ControllerInterface {

    private $pages;
    private $loader;
    private $matched;

    function __construct( TemplateLoaderInterface $loader ) {
        $this->pages = new \SplObjectStorage;
        $this->loader = $loader;
    }

    function init() {
        do_action( 'gm_virtual_pages', $this ); 
    }

    function addPage( PageInterface $page ) {
        $this->pages->attach( $page );
        return $page;
    }

    function dispatch( $bool, \WP $wp ) {
        if ( $this->checkRequest() && $this->matched instanceof Page ) {
            $this->loader->init( $this->matched );
            $wp->virtual_page = $this->matched;
            do_action( 'parse_request', $wp );
            $this->setupQuery();
            do_action( 'wp', $wp );
            $this->loader->load();
            $this->handleExit();
        }
        return $bool;
    }

    private function checkRequest() {
        $this->pages->rewind();
        $path = trim( $this->getPathInfo(), '/' );
        while( $this->pages->valid() ) {
            if ( trim( $this->pages->current()->getUrl(), '/' ) === $path ) {
                $this->matched = $this->pages->current();
                return TRUE;
            }
            $this->pages->next();
        }
    }        

    private function getPathInfo() {
        $home_path = parse_url( home_url(), PHP_URL_PATH );
        return preg_replace( "#^/?{$home_path}/#", '/', esc_url( add_query_arg(array()) ) );
    }

    private function setupQuery() {
        global $wp_query;
        $wp_query->init();
        $wp_query->is_page       = TRUE;
        $wp_query->is_singular   = TRUE;
        $wp_query->is_home       = FALSE;
        $wp_query->found_posts   = 1;
        $wp_query->post_count    = 1;
        $wp_query->max_num_pages = 1;
        $posts = (array) apply_filters(
            'the_posts', array( $this->matched->asWpPost() ), $wp_query
        );
        $post = $posts[0];
        $wp_query->posts          = $posts;
        $wp_query->post           = $post;
        $wp_query->queried_object = $post;
        $GLOBALS['post']          = $post;
        $wp_query->virtual_page   = $post instanceof \WP_Post && isset( $post->is_virtual )
            ? $this->matched
            : NULL;
    }

    public function handleExit() {
        exit();
    }
}

মূলত শ্রেণি একটি SplObjectStorageঅবজেক্ট তৈরি করে যেখানে সমস্ত যুক্ত পৃষ্ঠাগুলি অবজেক্টগুলি সংরক্ষণ করা হয়।

চালু 'do_parse_request', যোগ করা পৃষ্ঠাগুলির মধ্যে একটিতে বর্তমান URL টির মিল খুঁজে পেতে নিয়ন্ত্রণকারী শ্রেণি এই স্টোরেজটি লুপ করে।

যদি এটি পাওয়া যায়, ক্লাসটি ঠিক তেমনভাবে পরিকল্পনা করেছিল যা আমরা পরিকল্পনা করেছি: কিছু হুক, সেটআপ ভেরিয়েবলগুলি ট্রিগার করুন এবং শ্রেণিবদ্ধকরণের মাধ্যমে টেমপ্লেট লোড করুন TemplateLoaderInterface। তার পরে, ঠিক exit()

সুতরাং আসুন শেষ ক্লাস লিখুন:

<?php
namespace GM\VirtualPages;

class TemplateLoader implements TemplateLoaderInterface {

    public function init( PageInterface $page ) {
        $this->templates = wp_parse_args(
            array( 'page.php', 'index.php' ), (array) $page->getTemplate()
        );
    }

    public function load() {
        do_action( 'template_redirect' );
        $template = locate_template( array_filter( $this->templates ) );
        $filtered = apply_filters( 'template_include',
            apply_filters( 'virtual_page_template', $template )
        );
        if ( empty( $filtered ) || file_exists( $filtered ) ) {
            $template = $filtered;
        }
        if ( ! empty( $template ) && file_exists( $template ) ) {
            require_once $template;
        }
    }
}

ভার্চুয়াল পৃষ্ঠা সঞ্চিত টেমপ্লেট অক্ষমতা সঙ্গে একটি অ্যারের মধ্যে মিশে গিয়ে তৈরি হয় page.phpএবং index.php, আগে লোডিং টেমপ্লেট 'template_redirect'বহিস্কার করা হয়, নমনীয়তা যোগ করতে পারেন এবং সামঞ্জস্য উন্নত।

এর পরে, প্রাপ্ত টেমপ্লেটটি কাস্টম 'virtual_page_template'এবং মূল 'template_include'ফিল্টারগুলির মধ্য দিয়ে যায় : আবার নমনীয়তা এবং সামঞ্জস্যের জন্য।

অবশেষে টেমপ্লেট ফাইলটি সবেমাত্র লোড হয়েছে।

প্রধান প্লাগইন ফাইল

এই মুহুর্তে আমাদের প্লাগইন শিরোনাম সহ ফাইলটি লিখতে হবে এবং হুকগুলি যুক্ত করতে এটি ব্যবহার করতে হবে যা আমাদের কর্মপ্রবাহকে ঘটায়:

<?php namespace GM\VirtualPages;

/*
  Plugin Name: GM Virtual Pages
 */

require_once 'PageInterface.php';
require_once 'ControllerInterface.php';
require_once 'TemplateLoaderInterface.php';
require_once 'Page.php';
require_once 'Controller.php';
require_once 'TemplateLoader.php';

$controller = new Controller ( new TemplateLoader );

add_action( 'init', array( $controller, 'init' ) );

add_filter( 'do_parse_request', array( $controller, 'dispatch' ), PHP_INT_MAX, 2 );

add_action( 'loop_end', function( \WP_Query $query ) {
    if ( isset( $query->virtual_page ) && ! empty( $query->virtual_page ) ) {
        $query->virtual_page = NULL;
    }
} );

add_filter( 'the_permalink', function( $plink ) {
    global $post, $wp_query;
    if (
        $wp_query->is_page && isset( $wp_query->virtual_page )
        && $wp_query->virtual_page instanceof Page
        && isset( $post->is_virtual ) && $post->is_virtual
    ) {
        $plink = home_url( $wp_query->virtual_page->getUrl() );
    }
    return $plink;
} );

আসল ফাইলে আমরা সম্ভবত আরও শিরোনাম যুক্ত করব, যেমন প্লাগইন এবং লেখকের লিঙ্ক, বিবরণ, লাইসেন্স ইত্যাদি add

প্লাগিন গিস্ট

ঠিক আছে, আমরা আমাদের প্লাগইন দিয়ে কাজ শেষ করেছি। সমস্ত কোড এখানে একটি সংক্ষেপে পাওয়া যাবে

পৃষ্ঠা যুক্ত করা হচ্ছে

প্লাগইন প্রস্তুত এবং কাজ করছে, তবে আমরা কোনও পৃষ্ঠা যুক্ত করি নি।

এটি প্লাগইনের ভিতরেই, থিমের অভ্যন্তরে functions.php, অন্য একটি প্লাগইনে করা যেতে পারে etc.

পৃষ্ঠা যুক্ত করা কেবল একটি বিষয়:

<?php
add_action( 'gm_virtual_pages', function( $controller ) {

    // first page
    $controller->addPage( new \GM\VirtualPages\Page( '/custom/page' ) )
        ->setTitle( 'My First Custom Page' )
        ->setTemplate( 'custom-page-form.php' );

    // second page
    $controller->addPage( new \GM\VirtualPages\Page( '/custom/page/deep' ) )
        ->setTitle( 'My Second Custom Page' )
        ->setTemplate( 'custom-page-deep.php' );

} );

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

টেম্পলেট ফাইলের অভ্যন্তরে আপনি সমস্ত ওয়ার্ডপ্রেস টেম্পলেট ট্যাগ ব্যবহার করতে পারেন এবং আপনার প্রয়োজনীয় সমস্ত পিএইচপি এবং এইচটিএমএল লিখতে পারেন।

গ্লোবাল পোস্ট অবজেক্টটি আমাদের ভার্চুয়াল পৃষ্ঠা থেকে আসা ডেটাতে পূর্ণ। ভার্চুয়াল পৃষ্ঠাটি নিজেই $wp_query->virtual_pageভেরিয়েবলের মাধ্যমে অ্যাক্সেস করা যায় ।

ভার্চুয়াল পৃষ্ঠার জন্য ইউআরএল পাওয়া পৃষ্ঠাটি home_url()তৈরি করতে ব্যবহৃত একই পাথের পাশ দিয়ে যাওয়ার মতোই সহজ :

$custom_page_url = home_url( '/custom/page' );

নোট করুন যে লোড হওয়া টেমপ্লেটের মূল লুপটিতে the_permalink()ভার্চুয়াল পৃষ্ঠায় সঠিক পারমিলিংক ফিরে আসবে।

ভার্চুয়াল পৃষ্ঠাগুলির জন্য স্টাইল / স্ক্রিপ্টগুলির নোট

সম্ভবত যখন ভার্চুয়াল পৃষ্ঠাগুলি যুক্ত করা হয় তখন কাস্টম শৈলী / স্ক্রিপ্টগুলি সজ্জিত করা এবং তারপরে কেবল wp_head()কাস্টম টেম্পলেটগুলিতে ব্যবহার করা বাঞ্ছনীয় ।

এটি খুব সহজ, কারণ ভার্চুয়াল পৃষ্ঠাগুলি সহজেই $wp_query->virtual_pageভেরিয়েবলের দিকে তাকানো স্বীকৃত হয় এবং ভার্চুয়াল পৃষ্ঠাগুলি তাদের ইউআরএলগুলি দেখে অন্যের থেকে আলাদা করা যায়।

শুধু একটি উদাহরণ:

add_action( 'wp_enqueue_scripts', function() {

    global $wp_query;

    if (
        is_page()
        && isset( $wp_query->virtual_page )
        && $wp_query->virtual_page instanceof \GM\VirtualPages\PageInterface
    ) {

        $url = $wp_query->virtual_page->getUrl();

        switch ( $url ) {
            case '/custom/page' : 
                wp_enqueue_script( 'a_script', $a_script_url );
                wp_enqueue_style( 'a_style', $a_style_url );
                break;
            case '/custom/page/deep' : 
                wp_enqueue_script( 'another_script', $another_script_url );
                wp_enqueue_style( 'another_style', $another_style_url );
                break;
        }
    }

} );

ওপিকে নোটস

কোনও পৃষ্ঠা থেকে অন্য পৃষ্ঠায় ডেটা পাঠানো এই ভার্চুয়াল পৃষ্ঠাগুলির সাথে সম্পর্কিত নয়, তবে এটি কেবল একটি জেনেরিক কাজ।

তবে, যদি প্রথম পৃষ্ঠায় আপনার একটি ফর্ম থাকে এবং সেখান থেকে দ্বিতীয় পৃষ্ঠায় ডেটা পাস করতে চান তবে কেবলমাত্র ফর্ম actionসম্পত্তিতে দ্বিতীয় পৃষ্ঠার ইউআরএল ব্যবহার করুন ।

যেমন প্রথম পৃষ্ঠার টেম্পলেট ফাইলটিতে আপনি করতে পারেন:

<form action="<?php echo home_url( '/custom/page/deep' ); ?>" method="POST">
    <input type="text" name="testme">
</form>

এবং তারপরে দ্বিতীয় পৃষ্ঠার টেম্পলেট ফাইলটিতে:

<?php $testme = filter_input( INPUT_POST, 'testme', FILTER_SANITIZE_STRING ); ?>
<h1>Test-Me value form other page is: <?php echo $testme; ?></h1>

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

2
খুব চটজলদি এবং সরাসরি এগিয়ে সমাধান। আপডেট হয়েছে, টুইট করেছে।
কায়সার

কন্ট্রোলারে কোডটি কিছুটা ভুল ... চেকআরকোয়েস্ট () home_url () থেকে পথের তথ্য পাচ্ছে যা লোকালহোস্ট / ওয়ার্ডপ্রেস দেয় returns প্রিগ_রেপ্লেস এবং অ্যাড_উইকি_আর্গের পরে, এই ইউআরএলটি / ওয়ার্ডপ্রেস / ভার্চুয়াল-পৃষ্ঠা হয়ে যায়। এবং চেকরেখার ট্রিমের পরে এই ইউআরএলটি ওয়ার্ডপ্রেস / ভার্চুয়াল। ওয়ার্ডপ্রেসটি ডোমেনের মূল ফোল্ডারে ইনস্টল করা হলে এটি কাজ করবে। আপনি কি দয়া করে সেই সমস্যার সমাধান দিতে পারবেন কারণ আমি সঠিক ফাংশনটি খুঁজে পাচ্ছি না যা ডান ইউআরএল ফিরে আসবে। সবকিছুর জন্য তোমাকে ধন্যবাদ! (উত্তরটি নিখুঁত হয়ে ওঠার পরে আমি গ্রহণ করব :)
ব্যবহারকারী 1257255

2
অভিনন্দন, সুন্দর উত্তর এবং আমার এই অনেক কাজ বিনামূল্যে সমাধান হিসাবে দেখতে হবে।
বেল্টেজ

@ জিএম: আমার ক্ষেত্রে ওয়ার্ডপ্রেস ... / এইচটিডকস / ওয়ার্ডপ্রেস / ইন ইনস্টল করা আছে এবং সাইটটি লোকালহোস্ট / ওয়ার্ডপ্রেসে উপলব্ধ । home_url () লোকালহোস্ট / ওয়ার্ডপ্রেস এবং add_query_arg (অ্যারে ()) প্রদান / ওয়ার্ডপ্রেস / ভার্চুয়াল-পৃষ্ঠা / প্রদান করে। যখন আমরা R পথ এবং ছাঁটাইযুক্ত aring এই-> পৃষ্ঠাগুলি -> বর্তমান () -> getUrl () চেকআরকোয়েস্ট () তে তুলনা করি তখন সমস্যা কারণ $ পথটি wordpress/virtual-pageএবং পৃষ্ঠার ছাঁটা ইউআরএল virtual-page
ব্যবহারকারী 1257255

0

আমি একবার এখানে বর্ণিত একটি সমাধান ব্যবহার করেছি: http://scott.sherrillmix.com/blog/blogger/creating-a-better-fake-post-with-a-wordpress-plugin/

আসলে, যখন আমি এটি ব্যবহার করছিলাম, আমি সমাধানটি এমনভাবে প্রসারিত করি যাতে আমি একবারে একাধিক পৃষ্ঠা নিবন্ধভুক্ত করতে পারি (বাকী একটি কোড +/- এর সমাধানের মতো যা আমি উপরের অনুচ্ছেদ থেকে সংযুক্ত করছি)।

সমাধানটির জন্য আপনাকে ভাল পারমিলিক্সের অনুমতি দেওয়া দরকার ...

<?php

class FakePages {

    public function __construct() {
        add_filter( 'the_posts', array( $this, 'fake_pages' ) );
    }

    /**
     * Internally registers pages we want to fake. Array key is the slug under which it is being available from the frontend
     * @return mixed
     */
    private static function get_fake_pages() {
        //http://example.com/fakepage1
        $fake_pages['fakepage1'] = array(
            'title'   => 'Fake Page 1',
            'content' => 'This is a content of fake page 1'
        );
        //http://example.com/fakepage2
        $fake_pages['fakepage2'] = array(
            'title'   => 'Fake Page 2',
            'content' => 'This is a content of fake page 2'
        );

        return $fake_pages;
    }

    /**
     * Fakes get posts result
     *
     * @param $posts
     *
     * @return array|null
     */
    public function fake_pages( $posts ) {
        global $wp, $wp_query;
        $fake_pages       = self::get_fake_pages();
        $fake_pages_slugs = array();
        foreach ( $fake_pages as $slug => $fp ) {
            $fake_pages_slugs[] = $slug;
        }
        if ( true === in_array( strtolower( $wp->request ), $fake_pages_slugs )
             || ( true === isset( $wp->query_vars['page_id'] )
                  && true === in_array( strtolower( $wp->query_vars['page_id'] ), $fake_pages_slugs )
            )
        ) {
            if ( true === in_array( strtolower( $wp->request ), $fake_pages_slugs ) ) {
                $fake_page = strtolower( $wp->request );
            } else {
                $fake_page = strtolower( $wp->query_vars['page_id'] );
            }
            $posts                  = null;
            $posts[]                = self::create_fake_page( $fake_page, $fake_pages[ $fake_page ] );
            $wp_query->is_page      = true;
            $wp_query->is_singular  = true;
            $wp_query->is_home      = false;
            $wp_query->is_archive   = false;
            $wp_query->is_category  = false;
            $wp_query->is_fake_page = true;
            $wp_query->fake_page    = $wp->request;
            //Longer permalink structures may not match the fake post slug and cause a 404 error so we catch the error here
            unset( $wp_query->query["error"] );
            $wp_query->query_vars["error"] = "";
            $wp_query->is_404              = false;
        }

        return $posts;
    }

    /**
     * Creates virtual fake page
     *
     * @param $pagename
     * @param $page
     *
     * @return stdClass
     */
    private static function create_fake_page( $pagename, $page ) {
        $post                 = new stdClass;
        $post->post_author    = 1;
        $post->post_name      = $pagename;
        $post->guid           = get_bloginfo( 'wpurl' ) . '/' . $pagename;
        $post->post_title     = $page['title'];
        $post->post_content   = $page['content'];
        $post->ID             = - 1;
        $post->post_status    = 'static';
        $post->comment_status = 'closed';
        $post->ping_status    = 'closed';
        $post->comment_count  = 0;
        $post->post_date      = current_time( 'mysql' );
        $post->post_date_gmt  = current_time( 'mysql', 1 );

        return $post;
    }
}

new FakePages();

কাস্টম টেম্পলেট সম্পর্কে কী যেখানে আমি আমার ফর্মটি রাখতে পারি?
ব্যবহারকারী 1257255

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