Определение глобального массива в functions.php?

1 мар. 2013 г., 02:48:17
Просмотры: 27.4K
Голосов: 1

Я пытаюсь создать массив годов, который будет доступен в файлах шаблонов и как минимум в одной другой функции в functions.php.

function get_the_years() 
{
    global $year_arr = range(2001, date('Y')); // создаем массив от 2001 до текущего года
    return $year_arr;
}

Затем я хочу использовать его в функции, которая создает термин для каждого года в пользовательской таксономии 'year'.

function create_year_terms() {
foreach($year_arr as $value){   
    $term = term_exists($value, 'year');
        if ($term !== 0 && $term !== null) {
            echo $value . ' категория существует!';
        }
        else { wp_insert_term(
            $value, // термин 
            'year', // таксономия
            array(
                'description'=> 'Название года',
                'slug' => $value )
            );
            echo 'термин '. $value . ' создан';
        }
    }

}

И пытаюсь прикрепить эту функцию к хуку wp_login

add_action('wp_login', 'create_year_terms');

Я старался сделать домашнее задание и вроде бы "что-то" понимаю, но немного боюсь что-то сломать, добавляя неправильный код в functions.php, поэтому прошу прощения за мой вопрос.

2
Комментарии

Как этот вопрос относится конкретно к WordPress?

Chip Bennett Chip Bennett
1 мар. 2013 г. 02:56:31

Ой, извините, я не очень знаком с php, я ожидал, что это будет специфично для WordPress из-за хуков и созданных пользовательских терминов.

schwarzgrau schwarzgrau
1 мар. 2013 г. 03:02:45
Все ответы на вопрос 2
1

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

В вашем случае функция create_year_terms() должна вызывать global $year_arr в пределах своей области видимости.

Также вы всегда можете получить свою переменную в global области видимости, используя массив $GLOBALS с именем вашей переменной в качестве key, например:

$GLOBALS["year_arr"]

Обновление

Что касается выбора хука: во-первых, лучшей практикой будет помещать подобный код в плагин, а не в functions.php вашей темы. Во-вторых, используйте хук init; или зарегистрируйте хук активации для вашего плагина, а затем, возможно, примените wp_schedule_event с пользовательским интервалом в один год.

…но снова возникает вопрос: действительно ли это необходимо?

1 мар. 2013 г. 02:57:03
Комментарии

wp_schedule_event — действительно полезный совет. К сожалению, думаю, это необходимо. Я делал сайт для кинофакультета в своем колледже. Пока я еще учусь, я буду администрировать сайт, но он должен продолжать работать, даже если им займется кто-то другой.

schwarzgrau schwarzgrau
1 мар. 2013 г. 03:25:23
2

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

Во-вторых, насколько я знаю, сначала нужно объявить переменную как глобальную, а затем в новой строке присвоить ей значение:

global $myvar;
$myvar = "whatever";

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

И что именно вы хотите сделать с функцией? Вы знаете о хуках?

wp_login устарел — используйте wp_signon. Но я не совсем понимаю, что вы пытаетесь сделать...

1 мар. 2013 г. 03:02:45
Комментарии

спасибо за разъяснение по использованию global. Функция должна проверять, существует ли уже пользовательский термин с текущим годом, и если нет — создавать его. Я выбрал wp_login, потому что, насколько я знаю, нет хука, который срабатывает каждое 1-е января или что-то подобное, что я мог бы использовать.

schwarzgrau schwarzgrau
1 мар. 2013 г. 03:09:09

Зачем вам это нужно? Я обновил свой ответ выше, чтобы решить эту проблему.

Sunyatasattva Sunyatasattva
1 мар. 2013 г. 03:19:09