Partials के बीच PHP चर का सबसे अच्छा तरीका है?


16

मैं शीर्ष लेख में एक चर है। पीएचपी, जैसे:

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

एक बार मैं करता हूं:

var_dump($page_extra_title);

मैं हमेशा शीर्ष लेख से NULLबाहर निकलता हूं । php (var_dump ठीक से शीर्षलेख में काम करता है। केवल pp)। मैं एक ही चर को हर जगह चिपका रहा हूं, जिसकी मुझे आवश्यकता है (page.php, post.php, footer.php आदि), लेकिन यह पागलपन है और सब कुछ बनाए रखना लगभग असंभव बना देता है।

मैं सोच रहा हूं कि मेरी थीम की सभी फाइलों के माध्यम से एक चर को पार करने का सबसे अच्छा तरीका क्या है? मुझे लगता है कि "get_post_meta" के साथ फ़ंक्शन.php का उपयोग करना सबसे अच्छा विचार नहीं हो सकता है? :)



मुझे लगता है कि चर एक ही दायरे में है, मैं भी स्पष्ट कारणों के लिए ग्लोबल का उपयोग करने से बचना चाहता हूं।
Wordpressor

मेरा मानना ​​है कि आईलोसिन की टिप्पणी हाजिर है। एक PHP स्क्रिप्ट पता नहीं है कि दूसरा मौजूद है और यह स्थानीय चर या उनके मूल्यों तक नहीं पहुंच सकता है।
jdm2112

1
हेडर और फूटर एक फ़ंक्शन के माध्यम से शामिल किए जाते हैं, इसलिए उन फ़ाइलों में सब कुछ का दायरा उन फ़ंक्शन के स्कोप हैं।
22

4
दूत को गोली मत मारो :) केवल एक चीज मैंने कहा है, यह वास्तव में एक समस्या है। एक रास्ता है, यह globalसही है? लेकिन यह अच्छे कारणों से सवाल से बाहर है। इसके अलावा आपको उन्हें कॉल globalकरने के लिए कीवर्ड का उपयोग करके "कॉल" -विराइबल्स की तरह भी करना होगा। उपयोग के मामले के आधार पर सत्र एक समाधान हो सकता है। अन्यथा - जैसा कि उल्लेख किया गया है - मुझे लगता है कि आपके लिए काम करने के लिए एक फ़ंक्शन या एक वर्ग है जो जाने का रास्ता है।
निकोलई

जवाबों:


10

बुनियादी पृथक डेटा संरचनाएँ

डेटा के आसपास से गुजरने के लिए, आप सामान्य रूप से एक मॉडल का उपयोग करते हैं (जो "MVC" में "M" है)। आइए डेटा के लिए एक बहुत ही सरल इंटरफ़ेस देखें। इंटरफेस का उपयोग सिर्फ हमारे बिल्डिंग ब्लॉक्स के लिए "रेसिपी" के रूप में किया जाता है:

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. अन्य घटकों को नुकसान पहुँचाए बिना मॉडल / डेटा का आदान-प्रदान कर सकते हैं

WP एपीआई के साथ OOP PHP का संयोजन

बेशक इस बुनियादी थीम कार्यक्षमता की तरह उपयोग करके शायद ही संभव हो सकता है get_header(), get_footer(),, सही आदि? गलत। जो भी टेम्पलेट या टेम्प्लेट भाग आप चाहें, उसमें अपनी कक्षाओं को कॉल करें। इसे रेंडर करें, डेटा ट्रांसफ़ॉर्म करें, आप जो चाहें करें। यदि आप वास्तव में अच्छे हैं, तो आप सिर्फ कस्टम फ़िल्टर के अपने स्वयं के झुंड को जोड़ सकते हैं और इस बात का ध्यान रखने के लिए कुछ वार्ताकार हैं कि कौन से नियंत्रक द्वारा किस मार्ग / सशर्त टेम्पलेट लोड पर प्रदान किया जाता है।

निष्कर्ष?

आप एक समस्या के बिना WP में ऊपर की तरह सामान के साथ काम कर सकते हैं और अभी भी मूल एपीआई से चिपके रह सकते हैं और एक भी वैश्विक कॉल किए बिना कोड और डेटा का पुन: उपयोग कर सकते हैं और वैश्विक नाम स्थान को गड़बड़ाने और प्रदूषण कर सकते हैं।


3
अच्छा लग रहा है! मैं इस और अधिक, अच्छा जवाब में देख लेंगे!
मार्को

@kaiser लगभग 3 साल बाद, क्या आपकी सोच के ऊपर कोई अपडेट है? WP कोर टेम्प्लेटिंग वास्तव में किसी भी अधिक उन्नत दिशा में आगे नहीं बढ़ी है, इसलिए 3-पार्टी समाधान अभी भी एक चीज है।
lkraav

1
@ इकारव मैं शायद इसे आजकल नहीं लिखूंगा, लेकिन मैं अभी भी निश्चित हूं कि HTML टैग के अंदर चर की सामग्री का उत्पादन करने के लिए एक अलग वाक्यविन्यास का उपयोग नहीं करना (और एक अनावश्यक ओवरहेड से बचने का) तरीका है। दूसरी ओर, मैं शायद ही कभी इन दिनों PHP में फ्रंटेंड सामान लिख रहा हूं, लेकिन जावास्क्रिप्ट में। और मुझे वास्तव में पसंद है कि क्या VueJS और दोस्त मेज पर ला रहे हैं।
कैसर

11

यह @kaiser उत्तर के लिए एक वैकल्पिक तरीका है , कि मुझे बहुत अच्छा लगा (मेरे से +1) लेकिन कोर WP फ़ंक्शन के साथ उपयोग करने के लिए अतिरिक्त काम करने की आवश्यकता है और यह टेम्पलेट पदानुक्रम के साथ कम-से-कम एकीकृत है।

मैं जिस दृष्टिकोण को साझा करना चाहता हूं, वह एकल वर्ग पर आधारित है (यह मेरे द्वारा काम कर रहे कुछ से एक छीन लिया गया संस्करण है) जो टेम्प्लेट के लिए डेटा प्रस्तुत करने का ध्यान रखता है।

इसकी कुछ (IMO) दिलचस्प विशेषताएं हैं:

  • टेम्प्लेट मानक वर्डप्रेस टेम्प्लेट फाइलें (सिंगल.फपी, पेज. एफपी) हैं, उन्हें थोड़ी अधिक शक्ति मिलती है
  • मौजूदा टेम्पलेट सिर्फ काम करते हैं, इसलिए आप बिना किसी प्रयास के मौजूदा थीम से टेम्पलेट को एकीकृत कर सकते हैं
  • @kaiser दृष्टिकोण के विपरीत , टेम्प्लेट में आप $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()
     );
  }
}

( यहाँ Gist के रूप में उपलब्ध है।)

कैसे इस्तेमाल करे

केवल एक चीज की जरूरत है 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()विधि विशिष्ट डेटा को आंशिक रूप से पास करने की अनुमति देती है, बस दूसरे तर्क के रूप में डेटा की एक सरणी को पारित करना।

<?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
kaiser

@gmazzap लगभग 3 साल बाद, क्या आपकी सोच के ऊपर कोई अपडेट है? WP कोर टेम्प्लेटिंग वास्तव में किसी भी अधिक उन्नत दिशा में आगे नहीं बढ़ी है, इसलिए 3-पार्टी समाधान अभी भी एक चीज है।
lkraav

1
मैं इन दिनों कई विषयों पर काम नहीं करता। हाल ही में जाने का मेरा तरीका github.com/Brain-WP/Context + github.com/Brain-WP/Hierarchy को डेटा बनाने और टेम्प्लेट पास करने का था। टेम्पलेट इंजन खुद के लिए, मैं अलग अलग तरीकों का इस्तेमाल किया, पन्नी (बेशक), मूंछें, लेकिन यह भी टहनी (केवल जब मैं से बचने निर्भरता नरक में पूरे webiste पर नियंत्रण नहीं था) @lkraav
gmazzap

5

सरल उत्तर, वैरिएबल को कहीं से भी पास न करें क्योंकि यह वैश्विक चर का उपयोग करने से बदबू आ रही है जो कि बुराई है।

आपके उदाहरण से ऐसा लगता है जैसे आप एक प्रारंभिक अनुकूलन करने की कोशिश कर रहे हैं, फिर भी एक और बुराई;)

डेटा एपीआई प्राप्त करने के लिए उपयोग करें जो डीबी में संग्रहित है और एपीआई के रूप में इसके उपयोग को आउटसोर्स करने और इसके उपयोग को अनुकूलित करने की कोशिश न करें क्योंकि बस फिर से मूल्यों को प्राप्त करते हैं और यह फिल्टर और कार्यों को सक्रिय करता है। एपीआई कॉल को हटाकर आप इसे संशोधित किए बिना अपने कोड के व्यवहार को बदलने के लिए अन्य डेवलपर्स की क्षमता को हटा देते हैं।


2

हालाँकि केसर का उत्तर तकनीकी रूप से सही है, मुझे संदेह है कि यह आपके लिए सबसे अच्छा उत्तर है।

यदि आप अपनी खुद की थीम बना रहे हैं, तो मुझे लगता है कि यह वास्तव में कक्षाओं का उपयोग करके कुछ प्रकार की रूपरेखा स्थापित करने का सबसे अच्छा तरीका है (और शायद नाम स्थान और इंटरफेस भी, हालांकि यह WP थीम के लिए बहुत अधिक हो सकता है)।

दूसरी ओर, यदि आप किसी मौजूदा विषय का सिर्फ विस्तार / समायोजन कर रहे हैं और केवल एक या कुछ चर पास करने की आवश्यकता है, तो मुझे लगता है कि आपको साथ रहना चाहिए global। क्योंकि header.phpएक फ़ंक्शन में शामिल है, उस फ़ाइल में घोषित चर केवल उस फ़ाइल में उपयोग करने योग्य हैं। साथ globalआप उन्हें पूरी WP परियोजना में सुलभ बनाने:

इन 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
मैं असभ्य या कुछ भी नहीं बनना चाहता हूं, लेकिन यह वास्तव में वैश्विक दायरे में डाइविंग है। आपको वैश्विक दायरे में पूरी तरह से जोड़ने से बचना चाहिए। आपको यहां सम्मेलनों के नामकरण से वास्तव में सावधान रहना होगा और आपको यह सुनिश्चित करने की आवश्यकता है कि आपका चर नाम इस तरह से अद्वितीय होने वाला है कि कोई और इस तरह के नाम को पुन: उत्पन्न न कर सके। @kaiser दृष्टिकोण आपके लिए ओवरबोर्ड हो सकता है, लेकिन यह अब तक का सबसे अच्छा और सबसे सुरक्षित है। मैं आपको यह नहीं बता सकता कि इससे कैसे निपटा जाए, लेकिन मैं वास्तव में आपको वैश्विक दायरे से बाहर रहने की सलाह देता हूं :-)
पीटर गोयर्स

3
बेशक आपको सावधान रहने की ज़रूरत है कि आप अन्य चर को अधिलेखित न करें। आप एक अद्वितीय उपसर्ग या अपने कस्टम चर के साथ एक सरणी का उपयोग करके $wp_theme_vars_page_extra_titleया $wp_theme_vars['page_extra_title']उदाहरण के लिए , इससे निपट सकते हैं । यह सिर्फ एक स्पष्टीकरण था कि वैश्विक यहां क्यों काम करेंगे। ओपी ने सभी फाइलों के माध्यम से एक चर को पारित करने का तरीका पूछा, इसका उपयोग करने globalका एक तरीका है।
redelschaap

2
नहीं, ग्लोबल्स ऐसा करने का तरीका नहीं है। ग्लोबल्स का उपयोग किए बिना इसे प्राप्त करने के लिए बेहतर तरीके हैं। जैसा कि मैंने पहले कहा था, और जैसा कि @kaiser ने अपने जवाब में कहा, वैश्विक दायरे से बचें और इससे बाहर रहें। एक उदाहरण के रूप में, इसे बहुत आसान विकल्प लें, अपने कोड को किसी फ़ंक्शन में लपेटें और जहां आवश्यक हो फ़ंक्शन को कॉल करें। इस तरह, आपको वैश्विक सेट या उपयोग करने की आवश्यकता नहीं है।
पीटर गोअन ने

3
हाँ यही है। यह सबसे अच्छा तरीका नहीं हो सकता है, लेकिन यह निश्चित रूप से एक तरीका है।
redelschaap

2
but it is really bad practice diving into the global scopeकाश किसी ने बताया कि WP कोर डेवलपर्स के लिए। मैं वास्तव में नाम स्थान, डेटा अमूर्तता, डिज़ाइन पैटर्न, इकाई परीक्षण, और अन्य प्रोग्रामिंग सर्वोत्तम प्रथाओं / तकनीकों का उपयोग करके वर्डप्रेस के लिए लिखे गए कोड में नहीं समझता हूं कि जब वर्डप्रेस कोर ग्लैबल वैरिएबल (जैसे, विगेट्स) की तरह खराब कोडिंग प्रथाओं से अटे पड़े हैं। कोड)।
एजाज

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));
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.