xaviesteve
  • 0
Новичок

Переменная из плагина в тему

  • 0

Первый плагин, основной вопрос… Я пытаюсь напечатать переменную $xavi из плагина в тему следующим образом:

add_action('init', '_load_options');

function _load_options() {
  global $xavi;
}

Чтобы я мог использовать его в файле темы следующим образом:

<?=$xavi;?>

Это не похоже init на то, что это правильный хук действия для этого, но единственный другой, который имеет смысл, wp_head и не работает

Любые идеи, какой хук я должен использовать или как мне определить переменные (возможно, с помощью существующей функции/метода WP вместо создания с нуля)?

Спасибо!

Share
  1. Ваш веб-хост отключен register_globals в php.ini, поэтому вам нужно «регистрировать» свои переменные вручную каждый раз, когда вы хотите его использовать. Например:

    <?php
    global $xavi;
    echo $xavi;
    ?>
    

    Другой подход использует $GLOBALS массив:

    <?php
    echo $GLOBALS['xavi'];
    ?>
    

    Но, на мой взгляд, вам следует избегать использования глобальных переменных. Вместо этого используйте простой класс реестра, в который вы можете добавлять/получать свои значения.

    РЕДАКТИРОВАТЬ

    Это не специальное решение для WordPress и может быть немного излишним для этого простого вопроса. Шаблон реестра является официальным шаблоном проектирования программирования. То же самое касается шаблона singleton, который я использовал и здесь.

    Что мы делаем здесь, так это сохраняем наш контент в объекте реестра. Это синглтон, поэтому создается только один экземпляр.

    Я знаю, проблема не решена на самом деле. Вместо использования массива $GLOBALS мы используем класс реестра, который действительно также является «глобальным», поскольку мы вызываем экземпляр каждый раз, когда он нам нужен. У вас нет контроля, где вы это называете. Кроме того, тестирование одноэлементного класса может быть проблематичным. Если вам нужен больший контроль, просто посмотрите на фабричный шаблон с внедрением зависимостей.

    class Webeo_Registry {
        /**
         * Array to store items
         * 
         * @var array
         */
        private $_objects = array();
    
        /**
         * Stores the registry object
         * 
         * @var Webeo_Registry
         */
        private static $_instance = null;
    
        /**
         * Get the instance
         * 
         * @return void
         */
        public static function getInstance() {
            if (is_null(self::$_instance)) {
                self::$_instance = new self();
            }
    
            return self::$_instance;
        }
    
        /**
         * Constructor
         * 
         * @access private
         * @return void
         */
        private function __construct() {}
    
        /**
         * Set an item by given key and value
         * 
         * @param string $key
         * @param void $value
         * @return void
         */
        public function __set($key, $value) {
            // maybe you want to check if the value already exists
            $this->_objects[$key] = $value;
        }
    
        /**
         * Get an item by key
         * 
         * @param string $key Identifier for the registry item
         * @return void
         */
        public function __get($key) {
            if(isset($this->_objects[$key])) {
                $result = $this->_objects[$key];
            } else {
                $result = null;
            }
    
            return $result;
        }
    
        /**
         * Check if an item with the given key exists
         * 
         * @param string $key
         * @return void
         */
        public function __isset($key) {
            return isset($this->_objects[$key]);
        }
    
        /**
         * Delete an item with the given key
         * 
         * @param string $key
         * @return void
         */
        public function __unset($key) {
            unset($this->_objects[$key]);
        }
    
        /**
         * Make clone private, so nobody can clone the instance
         * 
         * @return void
         */
        private function __clone() {}
    }
    

    В вашем плагине/теме вам нужно только вернуть экземпляр, и вы готовы его использовать:

    $registry = Webeo_Registry::getInstance();
    
    // Define some options (just add it after the "->". The magic method __set will do the rest)
    $registry->optionA = 'awdawd';
    $registry->optionB = array(1,2,3);
    
    // Check the content
    print_r($registry);
    
    // Remove an item
    unset($registry->optionA);
    
    // Check if option exists
    if(isset($registry->optionA)) {
        echo 'option exist';
    } else {
        echo 'option does not exist';
    }
    
    • 0
  2. Другой вариант — использовать шорткод. В Кодексе Водпесса подробно описаны все детали. Но в основном настройте функцию, которая возвращает вашу переменную. Добавьте шорткод в wordpress, затем вызовите do_shortcode( '[shortcode]' ) внутри своего PHP-кода, и вы можете повторить его или сохранить для дальнейшей обработки. Вы можете использовать шорткод внутри контента.

    • 0
  3. Вы можете использовать функции в темах. Если я прав, вы можете добавить в свой шаблон следующее:

    <?php _load_options() ?> 
    

    Должно сработать. Однако _, вероятно, означает, что это частная функция, поэтому вам может потребоваться сделать функцию общедоступной.

    • 0
  4. Внутри вашего плагина

        function wtnerd_global_vars() 
        {        
            global $wtnerd;
    
            $wtnerd = "I am nerd";    
        }
    
        add_action( 'parse_query', 'wtnerd_global_vars' );
    

    Затем напечатайте переменную в свой шаблон/тему

    $GLOBALS['wtnerd'];
    

    мой источник: https://gist.github.com/aahan/7444046

    • 0

Оставить ответ

You must login to add an answer.