এটি @ কাইজার উত্তরের একটি বিকল্প পন্থা , যা আমি বেশ সূক্ষ্ম পেয়েছি (আমার কাছ থেকে +1) তবে মূল ডাব্লুপি ফাংশনগুলির সাথে অতিরিক্ত কাজ করার প্রয়োজন রয়েছে এবং এটি টেমপ্লেট হায়ারার্কির সাথে কম-ই কম সংহত হয়েছে।
আমি যে পদ্ধতিটি শেয়ার করতে চাই তা একটি একক শ্রেণির উপর ভিত্তি করে (এটি যেটি আমি কাজ করছি তার থেকে স্ট্রিপড ডাউন সংস্করণ) যা টেম্পলেটগুলির জন্য ডেটা রেন্ডার যত্ন নেয়।
এর কয়েকটি (আইএমও) আকর্ষণীয় বৈশিষ্ট্য রয়েছে:
- টেমপ্লেটগুলি হ'ল স্ট্যান্ডার্ড ওয়ার্ডপ্রেস টেম্পলেট ফাইলগুলি (একক.এফপি, পেজ.এফপি) তারা কিছুটা বেশি শক্তি অর্জন করে
- বিদ্যমান টেম্পলেটগুলি কেবলমাত্র কাজ করে, তাই আপনি কোনও প্রচেষ্টা ছাড়াই বিদ্যমান থিমগুলি থেকে টেমপ্লেট সংহত করতে পারেন
- @ কাইজার পদ্ধতির বিপরীতে , টেমপ্লেটগুলিতে আপনি
$this
কীওয়ার্ড ব্যবহার করে ভেরিয়েবলগুলি অ্যাক্সেস করেন : এটি আপনাকে অপরিবর্তিত ভেরিয়েবলের ক্ষেত্রে উত্পাদনের বিজ্ঞপ্তিগুলি এড়ানোর সম্ভাবনা দেয়
Engine
ক্লাস
namespace GM\Template;
class Engine
{
private $data;
private $template;
private $debug = false;
/**
* Bootstrap rendering process. Should be called on 'template_redirect'.
*/
public static function init()
{
add_filter('template_include', new static(), 99, 1);
}
/**
* Constructor. Sets debug properties.
*/
public function __construct()
{
$this->debug =
(! defined('WP_DEBUG') || WP_DEBUG)
&& (! defined('WP_DEBUG_DISPLAY') || WP_DEBUG_DISPLAY);
}
/**
* Render a template.
* Data is set via filters (for main template) or passed to method for partials.
* @param string $template template file path
* @param array $data template data
* @param bool $partial is the template a partial?
* @return mixed|void
*/
public function __invoke($template, array $data = array(), $partial = false)
{
if ($partial || $template) {
$this->data = $partial
? $data
: $this->provide(substr(basename($template), 0, -4));
require $template;
$partial or exit;
}
return $template;
}
/**
* Render a partial.
* Partial-specific data can be passed to method.
* @param string $template template file path
* @param array $data template data
* @param bool $isolated when true partial has no access on parent template context
*/
public function partial($partial, array $data = array(), $isolated = false)
{
do_action("get_template_part_{$partial}", $partial, null);
$file = locate_template("{$partial}.php");
if ($file) {
$class = __CLASS__;
$template = new $class();
$template_data = $isolated ? $data : array_merge($this->data, $data);
$template($file, $template_data, true);
} elseif ($this->debug) {
throw new \RuntimeException("{$partial} is not a valid partial.");
}
}
/**
* Used in templates to access data.
* @param string $name
* @return string
*/
public function __get($name)
{
if (array_key_exists($name, $this->data)) {
return $this->data[$name];
}
if ($this->debug) {
throw new \RuntimeException("{$name} is undefined.");
}
return '';
}
/**
* Provide data to templates using two filters hooks:
* one generic and another query type specific.
* @param string $type Template file name (without extension, e.g. "single")
* @return array
*/
private function provide($type)
{
$generic = apply_filters('gm_template_data', array(), $type);
$specific = apply_filters("gm_template_data_{$type}", array());
return array_merge(
is_array($generic) ? $generic : array(),
is_array($specific) ? $specific : array()
);
}
}
( এখানে গিস্ট হিসাবে উপলব্ধ ।)
কিভাবে ব্যবহার করে
কেবলমাত্র প্রয়োজন Engine::init()
মেথডকে কল করা , সম্ভবত 'template_redirect'
হুকের উপরে। এটি থিম functions.php
বা প্লাগইন থেকে করা যেতে পারে ।
require_once '/path/to/the/file/Engine.php';
add_action('template_redirect', array('GM\Template\Engine', 'init'), 99);
এখানেই শেষ.
আপনার বিদ্যমান টেম্পলেটগুলি প্রকাশিত হিসাবে কাজ করবে। তবে এখন আপনার কাস্টম টেম্পলেট ডেটা অ্যাক্সেস করার সম্ভাবনা রয়েছে।
কাস্টম টেম্পলেট ডেটা
টেমপ্লেটগুলিতে কাস্টম ডেটা পাস করার জন্য দুটি ফিল্টার রয়েছে:
'gm_template_data'
'gm_template_data_{$type}'
প্রথমটি সমস্ত টেম্পলেটগুলির জন্য বহিস্কার করা হয়, দ্বিতীয়টি নির্দিষ্ট টেমপ্লেট, প্রকৃতপক্ষে, ডাইমমিক অংশটি {$type}
ফাইল এক্সটেনশন ছাড়াই টেম্পলেট ফাইলের ভিত্তি নাম ।
যেমন ফিল্টারটি টেমপ্লেটে 'gm_template_data_single'
ডেটা পাঠাতে ব্যবহার করা যেতে পারে single.php
।
এই হুকগুলির সাথে সংযুক্ত কলব্যাকগুলিকে একটি অ্যারে ফিরিয়ে দিতে হবে , যেখানে কীগুলি ভেরিয়েবলের নাম।
উদাহরণস্বরূপ, আপনি টেম্পলেট ডেটা পছন্দ হিসাবে মেটা ডেটা পাস করতে পারেন:
add_filter('gm_template_data', function($data) {
if (is_singular()) {
$id = get_queried_object_id();
$data['extra_title'] = get_post_meta($id, "_theme_extra_title", true);
}
return $data;
};
এবং তারপরে, টেমপ্লেটের অভ্যন্তরে আপনি কেবল ব্যবহার করতে পারেন:
<?= $this->extra_title ?>
সংশোধনের ধাপ
যখন উভয় ধ্রুবক WP_DEBUG
এবংWP_DEBUG_DISPLAY
সত্য হয়, ক্লাস ওয়ার্কসিন ডিবাগ মোড। এর অর্থ হ'ল যদি কোনও ভেরিয়েবল সংজ্ঞায়িত না হয় তবে একটি ব্যতিক্রম নিক্ষেপ করা হয়।
যখন ক্লাসটি ডিবাগ মোডে নেই (সম্ভবত উত্পাদনে) একটি অপরিজ্ঞাত ভেরিয়েবল অ্যাক্সেস করলে একটি ফাঁকা স্ট্রিং আউটপুট হবে।
ডেটা মডেল
আপনার ডেটা সংগঠিত করার একটি দুর্দান্ত এবং প্রধান উপায় হ'ল মডেল ক্লাসগুলি ব্যবহার করা।
তারা খুব সাধারণ ক্লাস হতে পারে, উপরে বর্ণিত একই ফিল্টার ব্যবহার করে যে তথ্য ফেরত দেয়। অনুসরণ করার জন্য কোনও বিশেষ ইন্টারফেস নেই, সেগুলি আপনার পছন্দ অনুসারে সংগঠিত করা যেতে পারে।
নীচে, কেবল একটি উদাহরণ রয়েছে, তবে আপনি নিজের উপায়ে করতে স্বাধীন।
class SeoModel
{
public function __invoke(array $data, $type = '')
{
switch ($type) {
case 'front-page':
case 'home':
$data['seo_title'] = 'Welcome to my site';
break;
default:
$data['seo_title'] = wp_title(' - ', false, 'right');
break;
}
return $data;
}
}
add_filter('gm_template_data', new SeoModel(), 10, 2);
__invoke()
পদ্ধতি (যে রান যখন একটি বর্গ একটি কলব্যাক মত ব্যবহার করা হয়) ফেরৎ একটি স্ট্রিং জন্য ব্যবহার করা হবে <title>
টেমপ্লেটের ট্যাগ।
দ্বিতীয় আর্গুমেন্টটি যে পাঠানো হয়েছে 'gm_template_data'
তা হ'ল টেম্পলেটটির নামটি ধন্যবাদ, পদ্ধতিটি হোম পৃষ্ঠার জন্য একটি কাস্টম শিরোনাম প্রদান করে।
উপরের কোডটি থাকার পরে, এর মতো কিছু ব্যবহার করা সম্ভব
<title><?= $this->seo_title ?></title>
মধ্যে <head>
পৃষ্ঠার অধ্যায়।
Partials
ওয়ার্ডপ্রেসের মতো ফাংশন রয়েছে get_header()
বা get_template_part()
এটি প্রধান টেম্পলেটে পার্টিয়াল লোড করতে ব্যবহৃত হতে পারে।
অন্যান্য সমস্ত ওয়ার্ডপ্রেস ফাংশনের মতো এই ফাংশনগুলি টেমপ্লেটগুলি ব্যবহার করার সময় ব্যবহার করা যেতে পারে Engine
ক্লাসটি ।
একমাত্র সমস্যা হ'ল মূল ওয়ার্ডপ্রেস ফাংশনগুলি ব্যবহার করে লোড করা পার্টির ভিতরে কাস্টম টেম্পলেট ডেটা ব্যবহার করে উন্নত বৈশিষ্ট্যটি ব্যবহার করা সম্ভব নয় $this
।
এই কারণে, Engine
শ্রেণীর একটি পদ্ধতি রয়েছে partial()
যা একটি আংশিক লোড করতে দেয় (পুরোপুরি শিশু-থিমের সাথে সামঞ্জস্যপূর্ণ উপায়ে) এবং তবুও কাস্টম টেম্পলেট ডেটা পার্টিয়ালগুলিতে ব্যবহার করতে সক্ষম হয়।
ব্যবহার বেশ সহজ।
ধরে নিই partials/content.php
থিম (বা চাইল্ড থিম) ফোল্ডারের ভিতরে একটি ফাইল রয়েছে , এটি ব্যবহার করে এটি অন্তর্ভুক্ত করা যেতে পারে:
<?php $this->partial('partials/content') ?>
আংশিক ভিতরে সমস্ত প্যারেন্ট থিম ডেটা অ্যাক্সেস করা সম্ভব হবে।
ওয়ার্ডপ্রেস ফাংশনগুলি থেকে পৃথক, Engine::partial()
পদ্ধতিটি নির্দিষ্ট আর্গুমেন্ট হিসাবে নির্দিষ্ট ডেটা পার্টিয়েলে পাস করার অনুমতি দেয় simply
<?php $this->partial('partials/content', array('greeting' => 'Welcome!')) ?>
ডিফল্টরূপে, পার্টিয়ালদের প্যারেন্ট থিম এবং ডেটা এক্সপ্লিটিলিটে পাস ডেটাতে অ্যাক্সেস রয়েছে।
আংশিককে স্পষ্টতভাবে কিছু পরিবর্তনশীল পাস করার ক্ষেত্রে পিতামাতার থিম ভেরিয়েবলের একই নাম থাকলে ভেরিয়েবলটি সুস্পষ্টভাবে বিজয়ী হয়।
তবে বিচ্ছিন্ন মোডে একটি আংশিক অন্তর্ভুক্ত করাও সম্ভব , অর্থাত্ আংশিকের পিতামাতার থিমের ডেটাতে অ্যাক্সেস নেই। এটি করতে, কেবল true
তৃতীয় যুক্তি হিসাবে পাস করুন partial()
:
<?php $this->partial('partials/content', array('greeting' => 'Welcome!'), true) ?>
উপসংহার
এমনকি বেশ সহজ Engine
হলেও , ক্লাসটি বেশ সম্পূর্ণ, তবে অবশ্যই আরও উন্নতি করা যেতে পারে। যেমন কোনও ভেরিয়েবল সংজ্ঞায়িত করা হয়েছে কিনা তা পরীক্ষা করার কোনও উপায় নেই।
ওয়ার্ডপ্রেস বৈশিষ্ট্য এবং টেম্পলেট শ্রেণিবিন্যাসের সাথে এর 100% সামঞ্জস্যের জন্য ধন্যবাদ আপনি এটি কোনও সমস্যা ছাড়াই বিদ্যমান এবং তৃতীয় পক্ষের কোডের সাথে একীভূত করতে পারেন।
তবে নোট করুন যে কেবলমাত্র আংশিকভাবে পরীক্ষিত, তাই এমন সমস্যাগুলিও রয়েছে যা আমি এখনও আবিষ্কার করি নি।
"আমরা কী অর্জন করেছি?" এর অধীনে পাঁচটি বিষয় মধ্যে @kaiser উত্তর :
- ডেটা কাঠামো পরিবর্তন না করে সহজেই টেমপ্লেটগুলি বিনিময় করুন
- টেম্পলেটগুলি সহজেই পড়তে পারেন
- বৈশ্বিক সুযোগ এড়িয়ে চলুন
- ইউনিট-পরীক্ষা করতে পারেন
- অন্যান্য উপাদানগুলিকে ক্ষতি না করেই মডেল / ডেটা বিনিময় করতে পারে
আমার ক্লাসের জন্য সমস্ত বৈধ।