Логотип WordPress
WordPress

get_post() VS global $post: какой вариант правильный

Какую переменную использовать? get_post() или global $post? В случае с WordPress, стоит использовать именно get_post().

В чем же преимущество данной функции? Отличное описание предлагает

блог-шпаргалка для программистов и администраторов. Но попробую объяснить поподробнее.

Переменные

global $post – глобальная переменная. А объявление глобальных переменных без веского повода — плохой тон в среде программирования.

get_post – довольно важная функция. Она получает данные только из указанной записи, если укажете идентификатор (ID), то возвращать значение будет только из записи с указанным идентификатором.

Функция является основной для следующих функций:

  • wp_get_post_revision();

  • get_page_template_slug();

  • get_page_uri();

  • get_post_ancestors();

  • get_post_status();

  • get_post_mime_type();

  • get_the_ID();

  • wp_get_single_post();

  • comments_open();

  • get_post_type().

Как видите, с помощью global_post можно задействовать множество функций, если объявить в нужном месте. Это, конечно, отлично. Еще больше радует, что по умолчанию функция возвращает как раз обсуждаемую нами global $post по умолчанию.

Работает функция на основе метода класса wp_post – get_instance(), который позволяет строить абстракции в базе данных. Точнее задействовать их в функциях.

Как видите, переменная get_post дает гораздо большую вариативность при построении кода в WordPress, чем глобальная переменная. Фактически, на основе global $post для работы придется заново построить все методы, что и так есть на уровне ядра WP.

get_post
Типичный вариант объявления переменной $post

Вот, к примеру, код, встраиваемый в functions.php темы, либо в собственный плагин, предназначен для переадресации с вложений и с архивов дат.

function winnet_attachment_redirect() {
$post = get_post(); //замена параметру global $post
if (is_attachment() && isset($post->post_parent) && is_numeric($post->post_parent) && ($post->post_parent != 0) ) {
wp_redirect(get_permalink($post->post_parent), 301); // перенаправление на постоянную страницу загруженного файла
exit;
} elseif (is_attachment() && isset($post->post_parent) && is_numeric($post->post_parent) && ($post->post_parent < 1) ) {
wp_redirect(get_bloginfo('wpurl'), 302); // перенаправление отдельного документа или картинки post/page
exit;
}
}
//перенаправление с архивов дат
function winnet_archive_redirect()
{
$post = get_post();
if (is_date())
{
wp_redirect(home_url(), 301); // перенаправление на главную - home_url
exit;
}
}
add_action('template_redirect', 'winnet_attachment_redirect' ,1);
add_action('template_redirect', 'winnet_archive_redirect' ,1);
/*** редирект со страниц архивов ***/

Наверное, видите, где по умолчанию красовалось значение global $post. Вроде ничего страшного, но в сочетании с каким-нибудь другим кастомным кодом можно получить непредвиденные последствия.

Проблемы с global $post

В файлах шаблонов, в разных плагинах обычно выполняются итерации по циклу для любого запроса. Например, если пытаетесь получить доступ к определенной записи, то WP с задачей прекрасно справиться. Он выполнит запрос и получит доступ к нужному шаблону.

Используется для этого WP_Query, который как раз и задействуется с помощью get_post(), если вы хотите использовать данную функцию за пределами шаблона, например, в файле functions.php, собственном плагине, то знайте, что глобальная переменная уже объявлена в WP_Query, потому, использование ее за пределами определенных каноничных циклов приводит к замене стандартного значения $post, которое ожидают другие функции и методы WordPress.

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

Потому, использование get_post() выглядит более рациональным и меньше шансов, что произойдет критическая ошибка.

Надеюсь, что помог

К сожалению, не уверен, что понятно объяснил, почему лучше использовать get_post(), а не global $post, но сам удивляюсь, насколько сложно объяснять такие вещи. Но рекомендую обходиться без глобальных переменных. По крайней мере, не стоит их объявлять вне шаблонов.

И вообще, где можно использовать функции и методы WP, лучше использовать их, это поможет избежать ряда проблем в дальнейшем.

Добавить комментарий

Ваш e-mail не будет опубликован.