পার্টিয়ালের মধ্যে পিএইচপি ভেরিয়েবল পাস করার সর্বোত্তম উপায়?


16

আমার শিরোনাম.এফপিতে একটি পরিবর্তনশীল রয়েছে, যেমন:

$page_extra_title = get_post_meta($this_page->ID, "_theme_extra_title", true);

আমি একবার:

var_dump($page_extra_title);

আমি সর্বদা NULLহেডার.এফপি এর বাইরে চলে যাই (কেবলমাত্র শিরোনামে সঠিকভাবে কাজ করা হয়) _ আমি যেখানেই এটি প্রয়োজন ঠিক তেমন চলকটি পেস্ট করে আসছি (পেজ.এইচপিপি, পোস্ট.এফপি, পাদদেশ। পিএফপি ইত্যাদি), তবে এটি উন্মাদনা এবং সবকিছু বজায় রাখা প্রায় অসম্ভব করে তুলেছে।

আমি ভাবছি আমার থিমের সমস্ত ফাইলের মধ্যে একটি ভেরিয়েবল পাস করার সর্বোত্তম উপায় কী? আমার ধারণা, "get_post_meta" এর সাথে ফাংশন.এফপি ব্যবহার করা সেরা ধারণা নাও হতে পারে? :)



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

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

1
শিরোনাম এবং পাদলেখ একটি ফাংশনের মাধ্যমে অন্তর্ভুক্ত করা হয়েছে, সুতরাং সেই ফাইলগুলির মধ্যে সমস্ত কিছুর পরিধি সেই ফাংশনের স্কোপগুলি।
মিলো

4
ম্যাসেঞ্জারকে গুলি করবেন না :) আমি কেবল বলেছি এটি আসলে একটি সুযোগ সমস্যা। একটা উপায় আছে, তাই globalনা? তবে এটি সঙ্গত কারণেই প্রশ্নের বাইরে। globalকীওয়ার্ডটি উপলভ্য করার জন্য আপনার ব্যবহারের পরিবর্তে আপনার " ধরণের " কল করতে হবে-পরিবর্তনশীলগুলিকেও call ব্যবহারের কেস সেশনের উপর নির্ভর করে সমাধান হতে পারে। অন্যথায় - যেমন উল্লেখ করা হয়েছে - আমি মনে করি আপনার জন্য কাজ করার জন্য কোনও ক্রিয়াকলাপ বা শ্রেণি হ'ল উপায়।
নিকোলাই

উত্তর:


10

বেসিক পৃথক ডেটা স্ট্রাকচার

ডেটা অতিক্রম করার জন্য, আপনি সাধারণত একটি মডেল ব্যবহার করেন (এটি "এমভিসি" তে "এম")। আসুন ডেটা জন্য একটি খুব সহজ ইন্টারফেস তাকান। ইন্টারফেসগুলি কেবল আমাদের বিল্ডিং ব্লকের জন্য "রেসিপি" হিসাবে ব্যবহৃত হয়:

namespace WeCodeMore\Package\Models;
interface ArgsInterface
{
    public function getID();
    public function getLabel();
}

উপরে আমরা চারপাশে যাব: একটি সাধারণ আইডি এবং একটি "লেবেল"।

পারমাণবিক টুকরো একত্রিত করে তথ্য প্রদর্শন করা হচ্ছে

এর পরে আমাদের এমন কিছু ভিউ দরকার যা আমাদের মডেল এবং ... আমাদের টেমপ্লেটের মধ্যে আলোচনা করে।

namespace WeCodeMore\Package;
interface PackageViewInterface
{
    /**
     * @param Models\ArgsInterface $args
     * @return int|void
     */
    public function render( Models\ArgsInterface $args );
}

মূলত ইন্টারফেস বলে

"আমরা কিছু রেন্ডার করতে পারি এবং সেই কাজের জন্য একটি মডেল বাধ্যতামূলক"

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

রেন্ডার ফাংশনের দ্বিতীয় ধাপে আমরা প্রকৃত টেম্পলেট মোড়ক এবং টেমপ্লেটে মডেলটি তৈরি করতে একটি ক্লোজার ব্যবহার করি bindTo()

namespace WeCodeMore\Package;

use WeCodeMore\Package\Models\ArgsInterface;

/** @noinspection PhpInconsistentReturnPointsInspection */
class PackageView implements PackageViewInterface
{
    /** @var string|\WP_Error */
    private $template;
    /**
     * @param string $template
     */
    public function __construct( $template )
    {
        $this->template = ! file_exists( $template )
            ? new \WP_Error( 'wcm-package', 'A package view needs a template' )
            : $template;
    }
    /**
     * @param Models\ArgsInterface $args
     * @return int|void
     */
    public function render( Models\ArgsInterface $args )
    {
        if ( is_wp_error( $this->template ) )
            return print $this->template->get_error_message();

        /** @var $callback \Closure */
        $callback = function( $template )
        {
            extract( get_object_vars( $this ) );
            require $template;
        };
        call_user_func(
            $callback->bindTo( $args ),
            $this->template
        );
    }
}

ভিউ এবং রেন্ডারিং পৃথক করে

এর অর্থ হল যে আমরা নীচের মতো খুব সাধারণ টেম্পলেট ব্যবহার করতে পারি

<!--suppress HtmlFormInputWithoutLabel -->
<p><?= $label ?></p>

আমাদের বিষয়বস্তু রেন্ডার করতে। টুকরোগুলি একসাথে রাখলে আমরা নিম্নলিখিত লাইনগুলির কাছাকাছি কিছু পেতে পারি (আমাদের নিয়ামক, মধ্যস্থতাকারী ইত্যাদি):

namespace WeCodeMore\Package;

$view = new PackageView( plugin_dir_path( __FILE__ ).'tmpl/label.tmpl.php' );
$view->render( new Models\Args );

আমরা কী লাভ করেছি?

এইভাবে আমরা পারি

  1. ডেটা কাঠামো পরিবর্তন না করে সহজেই টেমপ্লেটগুলি বিনিময় করুন
  2. টেম্পলেটগুলি সহজেই পড়তে পারেন
  3. বৈশ্বিক সুযোগ এড়িয়ে চলুন
  4. ইউনিট-পরীক্ষা করতে পারেন
  5. অন্যান্য উপাদানগুলিকে ক্ষতি না করেই মডেল / ডেটা বিনিময় করতে পারে

ওওপি পিএইচপি ডাব্লুপি এপিআই এর সাথে সংযুক্ত করা

অবশ্যই এই মৌলিক theming কার্যকারিতা মত ব্যবহার করে কমই সম্ভব get_header(), get_footer(),, ডান ইত্যাদি? ভুল। আপনি যে টেম্পলেট বা টেম্পলেট অংশটি চান তা কেবল আপনার ক্লাসগুলিতে কল করুন। এটি রেন্ডার করুন, ডেটা ট্রান্সফর্ম করুন, যা খুশি তা করুন। আপনি যদি সত্যিই সুন্দর হন তবে আপনি নিজের কাস্টম ফিল্টারগুলি নিজেই যুক্ত করেন এবং কোন রুট / শর্তসাপেক্ষ টেম্পলেট লোডে কোন নিয়ামক দ্বারা কী রেন্ডার হয় তা যত্ন নেওয়ার জন্য কিছু আলোচক থাকতে হবে।

উপসংহার?

আপনি ডাব্লুপিতে উপরের মতো স্টাফ নিয়ে কোনও সমস্যা ছাড়াই কাজ করতে পারেন এবং এখনও বেসিক এপিআইতে আটকে থাকতে পারেন এবং কোড এবং ডেটা পুনরায় ব্যবহার করতে পারেন কোনও একক বিশ্বব্যাপী ফোন না করে বা গণ্ডগোল না করে এবং বিশ্বব্যাপী নাম স্থান দূষিত করে না।


3
দুর্দান্ত লাগছে! আমি এটি আরও ভাল চেহারা, ভাল উত্তর!
মার্কো

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

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

11

এটি @ কাইজার উত্তরের একটি বিকল্প পন্থা , যা আমি বেশ সূক্ষ্ম পেয়েছি (আমার কাছ থেকে +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 উত্তর :

  1. ডেটা কাঠামো পরিবর্তন না করে সহজেই টেমপ্লেটগুলি বিনিময় করুন
  2. টেম্পলেটগুলি সহজেই পড়তে পারেন
  3. বৈশ্বিক সুযোগ এড়িয়ে চলুন
  4. ইউনিট-পরীক্ষা করতে পারেন
  5. অন্যান্য উপাদানগুলিকে ক্ষতি না করেই মডেল / ডেটা বিনিময় করতে পারে

আমার ক্লাসের জন্য সমস্ত বৈধ।


1
হে হে। ভালই হয়েছে, সাথী :) +1
কায়সার

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

1
আমি আজকাল অনেক থিম কাজ করি না। ইদানীং আমার যাওয়ার উপায়টি ছিল ডেথ তৈরি করতে এবং টেমপ্লেটগুলিতে পাস করার জন্য github.com/Brain-WP/Context + github.com/Brain-WP/ হাইয়ার্কির সংমিশ্রণ । টেমপ্লেট ইঞ্জিন নিজেই, আমি বিভিন্ন পন্থা, ফয়েল (অবশ্যই), গোঁফ ব্যবহার করেছি, তবে টুইগ (কেবলমাত্র নির্ভরতা জাহান্নাম এড়ানোর জন্য যখন পুরো ওয়েবসাইটে আমার নিয়ন্ত্রণ ছিল তখনই) @ লকরাভ
গাজাজ্যাপ

5

সরল উত্তর, ভেরিয়েবলগুলি কোথাও পাস করবেন না কারণ এটি গ্লোবাল ভেরিয়েবলগুলি ব্যবহার করে যা খারাপ।

আপনার উদাহরণ থেকে দেখে মনে হচ্ছে আপনি একটি প্রাথমিক অপ্টিমাইজেশন করার চেষ্টা করছেন, অন্য একটি মন্দ;)

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


2

যদিও কায়সারের উত্তরটি প্রযুক্তিগতভাবে সঠিক, তবে আমি সন্দেহ করি এটি আপনার পক্ষে সেরা উত্তর।

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

অন্যদিকে, যদি আপনি কেবল বিদ্যমান থিমটি প্রসারিত / সামঞ্জস্য করছেন এবং কেবল এক বা কয়েকটি ভেরিয়েবল পাস করতে চান তবে আমার মনে হয় আপনার সাথে থাকা উচিত global। যেহেতু header.phpকোনও ফাংশনের মধ্যে অন্তর্ভুক্ত রয়েছে, সেই ফাইলটিতে আপনি যে ভেরিয়েবলগুলি ঘোষণা করেন তা কেবলমাত্র সেই ফাইলটিতেই ব্যবহারযোগ্য। আপনার সাথে globalপুরো ডাব্লুপি প্রকল্পে সেগুলি অ্যাক্সেসযোগ্য করে তুলেছে:

ইন header.php:

global $page_extra_title;

$page_extra_title = get_post_meta($this_page->ID, "_theme_extra_title", true);

single.php(উদাহরণস্বরূপ) ইন :

global $page_extra_title;

var_dump( $page_extra_title );

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

3
অবশ্যই আপনাকে সতর্কতা অবলম্বন করা উচিত যে আপনি অন্যান্য ভেরিয়েবলগুলি ওভাররাইট না করে। আপনি আপনার কাস্টম ভেরিয়েবল, একটি অনন্য প্রিফিক্স বা একটি অ্যারের ব্যবহার করে যে মোকাবেলা করতে পারেন $wp_theme_vars_page_extra_titleবা $wp_theme_vars['page_extra_title']উদাহরণস্বরূপ। এটি বিশ্বব্যাপী এখানে কেন কাজ করবে তা কেবল একটি ব্যাখ্যা ছিল। ওপি সমস্ত ফাইলের মধ্যে একটি ভেরিয়েবল পাস করার একটি উপায় জিজ্ঞাসা করেছিল, globalএটি করার একটি উপায়।
redelschaap

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

3
হ্যাঁ তাই হয়। এটি সর্বোত্তম উপায় নাও হতে পারে তবে এটি অবশ্যই একটি উপায়।
redelschaap

2
but it is really bad practice diving into the global scopeআমি আশা করি কেউ ডাব্লুপি কোর বিকাশকারীদের কাছে এটি জানান। ওয়ার্ডপ্রেসের জন্য লিখিত কোডে নেমস্পেস, ডেটা বিমূর্তি, নকশার নিদর্শন, ইউনিট টেস্টিং এবং অন্যান্য প্রোগ্রামিংয়ের সর্বোত্তম অনুশীলন / কৌশলগুলি ব্যবহার করার বিন্দুটি আমি সত্যিই বুঝতে পারি না যখন গ্লাবাল ভেরিয়েবলের (যেমন উইজেটগুলির মতো খারাপ কোডিং অনুশীলনগুলি দিয়ে ওয়ার্ডপ্রেস কোর লিখিত থাকে) কোড)।
এজাজ

1

অতিরিক্ত শিরোনাম পাওয়ার জন্য একটি ফাংশন লিখতে একটি সহজ সমাধান। আমি কেবলমাত্র একটিতে ডাটাবেস কল রাখতে স্ট্যাটিক ভেরিয়েবল ব্যবহার করি। এটি আপনার ফাংশন.ফ্যাপে রাখুন।

function get_extra_title($post_id) {
    static $title = null;
    if ($title === null) {
        $title = get_post_meta($post_id, "_theme_extra_title", true)
    }
    return $title;
}

হেডার.এফপি এর বাইরে, মানটি পেতে ফাংশনটি কল করুন:

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