আমি কীভাবে প্লাগইন থেকে পৃষ্ঠা টেম্পলেট তালিকার বিকল্প যুক্ত করতে পারি?


10

আমি একটি প্লাগইন থেকে কাস্টম পৃষ্ঠার টেম্পলেট তৈরি করার জন্য গত কয়েক ঘন্টা ধরে ঘুরে দেখছিলাম তবে এখনও ভাগ্য হয়নি।

আমি বিশেষভাবে যা করার চেষ্টা করছি তা হল কোনও পৃষ্ঠা সম্পাদনা করার সময় উপলভ্য পৃষ্ঠাগুলিগুলির তালিকার একটি বিকল্প যুক্ত করা, এবং অন্য কোনও পদ্ধতি ব্যবহার না করা যেমনif( is_page( 'page-slug' ) ) { /* etc */ }

এটি করার জন্য আমি কি কোনও বৈশ্বিক পরিবর্তনশীল পরিবর্তন করতে পারি?

সম্পাদনা:

আমি বর্তমানে এই কোডটি ব্যবহার করছি, @ m0r7if3r লিঙ্কের ভিত্তিতে আমাকে একটি মন্তব্যে জানিয়েছে, সমস্যাটি হচ্ছে পৃষ্ঠাটি দেখার সময় এই ফাংশনটি চালানো হবে তবে পৃষ্ঠা সম্পাদনার সময় নয় (পৃষ্ঠা টেমপ্লেটগুলির সাথে ড্রপডাউন তালিকাটি তৈরি করতে) :

class JW_SiteGrader {

    private static $instance;

    private function __construct() {


        add_action( 'template_redirect', array( &$this, 'sitegrader_template_redirect' ), 20 );

    }

    public static function getInstance() {

        // Return the class data in a Singleton fashion
        if (self::$instance == null)
            self::$instance = new JW_SiteGrader();
        return self::$instance;

    }

    public function sitegrader_template_redirect() {

        add_filter( 'page_template', array( &$this, 'sitegrader_page_template' ), 10, 1 );

    }

    public function locate_plugin_template( $template_names, $load = false, $require_once = true ) {

        if ( !is_array( $template_names ) )
            return '';

        $located = '';

        $this_plugin_dir = WP_PLUGIN_DIR . '/' . str_replace( basename( __FILE__ ), '', plugin_basename( __FILE__ ) );

        foreach ( $template_names as $template_name ) {

            if ( !$template_name )
                continue;

            if ( file_exists( STYLESHEETPATH . '/' . $template_name ) ) {

                $located = STYLESHEETPATH . '/' . $template_name;
                break;

            } else if ( file_exists( TEMPLATEPATH . '/' . $template_name ) ) {

                $located = TEMPLATEPATH . '/' . $template_name;
                break;

            } else if ( file_exists( $this_plugin_dir .  $template_name ) ) {

                $located =  $this_plugin_dir . $template_name;
                break;

            }

        }

        if ( $load && '' != $located )
            load_template( $located, $require_once );

        return $located;
    }

    public function sitegrader_page_template( $template ) {

        $object = get_queried_object();

        if ( 'page' == $object->post_type ) {

            // New 
            $templates[] = "page-sitegrader.php";
            // Like in core
            $templates[] = "page-{$object->post_type}.php";
            $templates[] = "page.php";

            return locate_template( $templates );  

        }

        // return apply_filters('page_template', $template);
        return $template;
    }

}

সম্পাদনা 2:

দেখে মনে হচ্ছে যে এই কার্যকারিতাটি ভবিষ্যতের আপডেটে প্রকাশিত হবে, আমি এটি সম্পর্কে বেশ কয়েকটি ট্র্যাকের টিকিট পড়েছি এবং কিছুটা আলোচনা হয়েছে তবে আসল উত্তর নেই (আশা করি 3.4)) ট্র্যাকের টিকিটের ইউআরএল কিছুটা এখানে তালিকাবদ্ধ করবে।

সম্পাদনা 3:

উপরের কোডটি কাজ করে, তবে কেবলমাত্র আমি এই মুহুর্তে আসছি যে কোনও নতুন পৃষ্ঠা সম্পাদনা / যুক্ত করার সময় ড্রপডাউন তালিকায় কোনও টেম্পলেট যুক্ত হচ্ছে না added আমি কয়েকটি জিনিস চেষ্টা করছি এবং শীঘ্রই আমার প্রশ্ন আপডেট করব।


2
আপনি কি এরকম কিছু চেষ্টা করেছেন ?
মরিফায়ার

@ m0r7if3r (যদি আপনি এটি চেষ্টা করেন, দয়া করে এটি কীভাবে কার্যকর হয়েছিল তা একটি বার্তাটি ছেড়ে দিন - ধন্যবাদ!)
কায়জার

@ কাইজার আমি তার প্রস্তাবিত কোডটি চেষ্টা করেছিলাম, একমাত্র অনুপস্থিত লিঙ্কটি হ'ল মেটা বক্সটি ড্রপডাউন তালিকায় টেমপ্লেট যুক্ত করার জন্য (যতদূর আমি জানি!)।
জ্যারেড

@ জ্যারেড আমার উত্তরটি এ এর নীচের অংশে অনুরূপ প্রশ্ন এবং সম্পর্কিত ট্র্যাকের টিকিটের দিকে দেখুন। আপনার কোডটি বিজ্ঞাপন করুন) যদি এটি প্রতিটি পৃষ্ঠায় প্রদর্শিত না হয় তবে আপনি উদাহরণটি চালাতে ভুল হুক ব্যবহার করছেন। আপনি কোন হুক ব্যবহার করছেন?
কায়সার

@ কাইজার আমি হুকটি ব্যবহার করছি page_template, আমার সম্পাদনায় উপরের কোডটি বর্তমানে ব্যবহৃত হচ্ছে। আমার কি template_redirectহুক ব্যবহার করার এবং তারপরে page_templateসেখানে ফিল্টার যুক্ত করার দরকার আছে?
জেয়ার্ড

উত্তর:


4

ফিল্টার? যে কেউ?

সাহায্যের জন্য কোনও ফিল্টার নেই: page_template_dropdown($template);ড্রপ ডাউন তৈরিতে ব্যবহৃত হয় এবং এটি ফিল্টারযোগ্য নয়।

টেম্পলেট অ্যারে মধ্যে স্নেকিং?

ড্রপ ডাউনস সামগ্রীগুলি তৈরি করতে, মূল মেটা বক্স ব্যবহার করে get_page_templates()। ভিতরে থেকে, ফাংশনটি নীচের মত দেখাচ্ছে:

$themes = get_themes();
$theme = get_current_theme();
$templates = $themes[$theme]['Template Files'];

কিন্তু get_themes();এরপরে যখন সন্ধান করব তখন টেমপ্লেটগুলির তালিকাটি আটকে রাখার কোনও সম্ভাবনা নেই। আরও আমাদের সমস্যা আছে যে থিম ডিরেক্টরি থেকে বাইরে কোনও টেম্পলেট পাওয়ার সুযোগ নেই ...

... একটি থিম জাল!

তত্ত্ব এবং এটির অসুবিধাগুলি ...

আপনি register_theme_directory()অতিরিক্ত থিম ডিরেক্টরি যুক্ত করতে ব্যবহার করতে পারেন যেখানে আপনি টেম্পলেটগুলি রাখতে পারেন। সুতরাং সবচেয়ে সহজ বিষয় হ'ল আপনার প্লাগইনকে থিম ফোল্ডার হিসাবে নিবন্ধন করাও হবে:

// Register during init hook:
register_theme_directory( plugin_dir_path( __FILE__ ).'templates' );

দ্রষ্টব্য: এটি যেখানে কাজ করবে এটি সম্পর্কে আমি নিশ্চিত নই

প্লাগইন অ্যাক্টিভেশন চলাকালীন: তারপরে style.css.phpআপনার templatesফোল্ডারের ভিতরে একটি ফাইল রাখা উচিত । এটি আপনাকে আপনার ফাইলে ভেরিয়েবল যুক্ত করার অনুমতি দেবে। এই পরিবর্তনশীলটি তখন মূল থিম হবে। এবং মূল থিমটি কেবল সক্রিয় থিম হওয়া উচিত। তারপরে আপনার প্লাগইনে আপনার সক্রিয় থিমটি আপডেট করুন।

খসড়া # 2: ea উপস্থিতি «ইউআই সম্পর্কে ... সম্ভবত একটি নোট যুক্ত করুন যে এই" থিম "প্রকৃত থিম হিসাবে ব্যবহার করার উদ্দেশ্যে নয়। আমি আপনার কল্পনা অবধি বাকি activ এই থিমটি সক্রিয় করা এড়িয়ে চলুন « যাইহোক: এটি কাজ করা উচিত।

খোল # 2: এই কৌশলটি সফলভাবে চাইল্ড থিমগুলি এড়াতে পারবে। আপনাকে একটি প্যারেন্ট থিম রাখতে অনুমতি দেওয়া হয়েছে। বেশি কিছু না.


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

1
আসলে তা না. এটি হবার কথা নয় এবং অতএব মূলটির অভাব রয়েছে। আপনি কি উপরে ইপস্টেনুর লিঙ্কটি চেষ্টা করেছেন ? আমি ইতিমধ্যে সেই রুটে যাওয়ার চেষ্টা করেছি তবে অন্য সমাধানের সাথে - একটি মৃত পথে শেষ হয়ে গিয়েছি। সেরা বাজি হ'ল টিকিটগুলি অনুসরণ করা, আপনি যেখানেই থাকুন না কেন এবং তাদের লিঙ্ক করুন। : /
কায়সার

2

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

আমি আশা করি তারা পরবর্তী কোর প্রকাশে হুকের মাধ্যমে আপনি যা করতে চেয়েছিলেন তা প্রকাশ করেছেন।


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

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

অবশ্যই, আমি মনে করি এটি কার্যকর হতে পারে। আমি এটি দিয়ে যাব এবং আমার প্রশ্নে ফলাফল পোস্ট করব। লিঙ্কের জন্য ধন্যবাদ, এটি সাহায্য করে!
জ্যারেড

1

আমি উত্সটির মাধ্যমে একটি ব্রাউজ নিয়েছি, এবং বেশ আশ্চর্যজনকভাবে এটি করার উপায় বলে মনে হচ্ছে না! আমার প্রস্তাবিত হ্যাকটি থিম ওভাররাইড / দ্বিতীয় থিম ড্রপডাউন সহ একটি দ্বিতীয় মেটা বক্স যুক্ত করা হবে to তারপরে এই ফিল্টারটিতে প্রবেশ করুন:

# wp-includes/theme.php line 751 in 3.3.1:
return apply_filters( "{$type}_template", locate_template( $templates ) );

আপনার থিম ফাইলটি যদি ওভাররাইড করা হয় তবে তা ফিরিয়ে আনতে। অবশ্যই, আপনি যদি এটি চান তবেই আপনি কেবল যুক্ত_ ফিল্টার করতে চান।

যদি আপনি অভিনব হতে চান, আপনি মূল বাক্সটি স্ক্র্যাপ করে এটি পুনরায় তৈরি করতে পারেন (অবশ্যই ফিল্টারগুলির মাধ্যমে, মূল কোডটি সংশোধন না করে)।

আমি সেই কার্যকারিতাটির জন্য একটি ট্র্যাক টিকিট যুক্ত করার পরামর্শও দেব (যদি এর জন্য ইতিমধ্যে সেখানে না থাকে)।


1
ট্র্যাকের জন্য ডাব্লু / প্রস্তাবনা সম্মত হন agree
হেলগাটিভিকিং

: এটা ইতিমধ্যে TRAC হবে বলে মনে হয় core.trac.wordpress.org/ticket/15803
জ্যারেড

1
আমি শুধু এই তদন্ত একক পোস্টের প্রকারের টেমপ্লেট সম্বন্ধে আরেকটি প্রশ্ন । আপনি উত্তর শেষে ট্র্যাক টিকিট পেতে পারেন। আসুন 3.4 এর জন্য আশা করি
কায়সার

1

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


আপনি কি পুরো কোডটি দেখিয়ে কিছু মনে করবেন? বর্তমানে এটি কেবল মোটামুটি ধারণা। ধন্যবাদ।
কায়সার

1

ফাংশন theme_page_templatesদ্বারা ব্যবহৃত হুক পরীক্ষা করুন get_page_templates, ফিল্টারটি 4.9-এ আপডেট হয়েছে 3.9 থেকে:

apply_filters( 'theme_page_templates', $page_templates, $this, $post );

এখানে আরও সম্পূর্ণরূপে ব্যাখ্যা করা হয়েছে: wordpress.stackexchange.com/a/255820/75495
cjbj

-2

DuckDuckGo সঙ্গে একটি অনুসন্ধান ফলাফলে একটি ওয়ার্ডপ্রেস পৃষ্ঠা টেমপ্লেট যোগ শিরোনামে একটি wpmu.org পৃষ্ঠাতে আমার জন্য উত্তর পরিণত আপ ওয়ার্ডপ্রেস কাস্টম পৃষ্ঠা টেমপ্লেট টিউটোরিয়াল

মূলত, থিম ডিরেক্টরি ভিতরে, ডাব্লুপি-সামগ্রী / থিম / আপনার থিম , একটি বিদ্যমান পৃষ্ঠার টেমপ্লেটটি আপনার পছন্দসই নতুন পিএইচপি ফাইলের নামে অনুলিপি করুন। ফাইলটির শীর্ষে মন্তব্যে ম্যাজিক "টেম্পলেট নাম:" সম্পত্তি মানটি পরিবর্তন করার যত্ন নিয়ে নতুন ফাইল সম্পাদনা করুন।

এটি ছিল সেখানে ছিল। এটি সম্ভবত এটি এমন একটি বৈশিষ্ট্য যা প্রশ্নটি পোস্ট-ডেট করে। বিশ-এলিভেন থিম সহ আমি WP 3.5 ব্যবহার করছি।

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


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