установка переменной в header.php, но не видимая в footer.php - PullRequest
15 голосов
/ 12 марта 2010

в WordPress, я установил переменную в header.php

<?php
$var= 'anything'
?>

но в footer.php когда я его повторяю

<?php
echo $var;
?>

У меня ничего не напечатано ... почему!>

Ответы [ 5 ]

24 голосов
/ 12 марта 2010

Вы находитесь не в той же области видимости, поскольку файлы заголовка и нижнего колонтитула включены в тело функции. Итак, вы объявляете локальную переменную и ссылаетесь на другую локальную переменную (из другой функции).

Так что просто объявите вашу переменную как глобальную:

$GLOBALS[ 'var' ] = '...';

Тогда:

echo $GLOBALS[ 'var' ];
10 голосов
/ 19 октября 2012

Я знаю, что вы уже приняли ответ на этот вопрос; Тем не менее, я думаю, что есть гораздо лучший подход к проблеме переменной области, чем передача переменных в массив $GLOBALS.

Возьмите файл functions.php в вашей теме, например. Этот файл включен за пределы функций get_header() и get_footer(). На самом деле он заменяет все, что вы можете делать в своей теме (и я верю также в область действия плагина - хотя я должен был это проверить).

Если вы хотите установить переменную, которую хотите использовать в файлах верхнего / нижнего колонтитула, вам следует делать это в файле functions.php, а не загрязнять массив $ GLOBALS. Если у вас есть больше переменных, в которых вы хотите убедиться, рассмотрите возможность использования базового объекта Registry с геттерами / сеттерами. Таким образом, ваши переменные будут лучше инкапсулированы в области, которой вы можете управлять.

Реестр

Вот пример Registry класса, с которого можно начать, если:

<?php
/**
 * Registry
 *
 * @author Made By Me
 * @version v0.0.1
 */
class Registry
{
    # +------------------------------------------------------------------------+
    # MEMBERS
    # +------------------------------------------------------------------------+
    private $properties = array();

    # +------------------------------------------------------------------------+
    # ACCESSORS
    # +------------------------------------------------------------------------+
    /**
     * @set     mixed   Objects
     * @param   string  $index  A unique index
     * @param   mixed   $value  Objects to be stored in the registry
     * @return  void
     */
    public function __set($index, $value)
    {
        $this->properties[ $index ] = $value;
    }

    /**
     * @get     mixed   Objects stored in the registry
     * @param   string  $index  A unique ID for the object
     * @return  object  Returns a object used by the core application.
     */
    public function __get($index)
    {
        return $this->properties[ $index ];
    }

    # +------------------------------------------------------------------------+
    # CONSTRUCTOR
    # +------------------------------------------------------------------------+
    public function __construct()
    {
    }


}

Сохраните этот класс в своей теме где-нибудь, например. /classes/registry.class.php Включите файл вверху вашего functions.php файла: include (get_template_directory (). '/Classes/registry.class.php');

Пример использования

Хранение переменных:

$registry = new Registry();
$registry->my_variable_name = "hello world";

Получение переменных:

echo '<h1>' .  $registry->my_variable_name . '</h1>'

Реестр будет принимать любой тип переменной.

Примечание: Я обычно использую SplObjectStorage в качестве внутреннего хранилища данных, но я заменил его для обычного массива ole для этого случая.

3 голосов
/ 20 августа 2014

Я знаю, что это немного старый вопрос, и за решение проголосовали, но я решил поделиться другим вариантом и просто нашел лучшее решение (которое работает) без использования Globals

function fn_your_var_storage( $var = NULL )
{
    static $internal;

    if ( NULL !== $var )
    {
        $internal = $var;
    }

    return $internal;
}

// store the value
fn_your_var_storage( 'my_value' );

// retrieve value
echo fn_your_var_storage(); // print my_value
0 голосов
/ 04 августа 2015

В WordPress Header, любой шаблон, нижний колонтитул - это разные функции, поэтому вы должны объявить любую переменную как глобальную переменную, чтобы получить к ней доступ.

/** header.php **/
<?php
global $xyz;
$xyz="123456"; ?>

/** Template.php or Footer.php **/
<?php 
echo $xyz; ///return 123456
?>
0 голосов
/ 17 июля 2015

попробуйте этот код

сначала определите вашу начальную переменную

  $var="something";

затем используйте $ _GLOBALS

  $_GLOBALS['myvar']=$var;

и, наконец, используйте глобальную переменную где угодно

  global $myvar;

определить строку внутри $ _GLOBALS в качестве имени глобальной переменной или использовать $ _GLOBALS ['myvar'] непосредственно в коде без использования глобальной

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...