Получение ID страницы внутри цикла
У меня есть шаблон страницы, который содержит цикл для отображения записей блога. Внутри цикла используется функция get_template_part('content', 'custom') для подключения шаблона (content-custom.php), который выводит содержимое записи. Возможно ли получить ID текущей страницы внутри файла content-custom.php?
Согласно этому ответу, вы можете использовать get_queried_object_id(), который пока ещё не добавлен в Codex, но связан с get_queried_object()
$page_id = get_queried_object_id();
Ты действительно пошел далеко и пересек границы. +1 за мисс викинг :)
Pieter Goosen
Спасибо @PieterGoosen, но мне не пришлось далеко копать... это был первый результат в Google.
helgatheviking
@helgatheviking Но это не сработает, так как он модифицирует глобальный объект $wp_query. Я что-то упускаю?
Krzysiek Dróżdż
@KrzysiekDróżdż Не думаю, что ты что-то упускаешь. Я не видел упоминания об этом в вопросе, и в любом случае, изменять глобальную переменную $wp_query — плохая идея.
helgatheviking
@helgatheviking Да, это плохая идея, но он всё равно это делает :)
Krzysiek Dróżdż
@KrzysiekDróżdż Я всё ещё не вижу, где он говорит, что делает это? Но если автор вопроса решает игнорировать советы не изменять глобальные переменные, то он должен быть готов к тому, что некоторые основные функции могут работать не так, как ожидается.
helgatheviking
@helgatheviking В комментарии: http://wordpress.stackexchange.com/questions/144471/getting-page-id-inside-loop/144484?noredirect=1#comment207844_144472
Krzysiek Dróżdż
@KrzysiekDróżdż Я не интерпретирую этот комментарий как то, что он изменяет глобальные переменные, просто get_the_ID() не возвращает то, что ему нужно. Думаю, мы не узнаем, пока автор вопроса не вернется, чтобы проверить мой ответ.
helgatheviking
Если у кого-то есть решение работающей пагинации без использования основного запроса, пожалуйста, покажите мне. Я знаю, что вмешиваться в основной запрос — не круто, но я не могу получить работающую пагинацию без его использования.
Sodbileg Gansukh
@SodbilegGansukh Похоже, вы задаёте новый вопрос, и вам следует опубликовать его отдельно. В следующий раз объясните, что вы делаете с основным запросом, чтобы люди могли дать вам более точные советы/ответы. Я до сих пор не знаю, что именно вы делаете с основным запросом, поэтому не могу прокомментировать, но считаю, что ответил на изначально заданный вопрос.
helgatheviking
Вы можете использовать все тегов шаблонов внутри этого файла, поэтому чтобы получить ID, просто используйте get_the_ID() (или the_ID() для его вывода).
get_the_ID() получает числовой ID текущей записи. Не имеет параметров и возвращает ID текущей записи.
the_ID() выводит числовой ID текущей записи. Также не имеет параметров.
Если вы хотите получить доступ к ID страницы, которая содержит ваш пользовательский цикл, вы можете сделать это следующим образом:
Решение 1 (простое, но не самое лучшее с использованием глобальной переменной)
В шаблоне вашей страницы:
<?php
global $parent_page_id;
$parent_page_id = get_the_ID();
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
$args = array( 'post_type' => 'post', 'paged' => $paged );
$temp = $wp_query;
$wp_query = null;
$wp_query = new WP_Query( $args );
$wp_query->query( $args );
?>
<?php if ( $wp_query->have_posts() ) : ?>
<?php while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
<?php get_template_part( 'content', 'custom' ); ?>
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>
<?php else : ?>
<?php get_template_part( 'no-results', 'index' ); ?>
<?php endif; ?>
И в шаблоне содержимого записи:
...
global $parent_page_id; // теперь вы можете использовать переменную parent_page_template
...
Решение 2 (более правильное с использованием пользовательского запроса)
В шаблоне вашей страницы:
<?php
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
$args = array( 'post_type' => 'post', 'paged' => $paged );
$my_custom_query = new WP_Query( $args );
?>
<?php if ( $my_custom_query->have_posts() ) : ?>
<?php while ( $my_custom_query->have_posts() ) : $my_custom_query->the_post(); ?>
<?php get_template_part( 'content', 'custom' ); ?>
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>
<?php else : ?>
<?php get_template_part( 'no-results', 'index' ); ?>
<?php endif; ?>
И в шаблоне содержимого записи:
...
... $wp_query->queried_object_id; // здесь будет содержаться объект запроса из оригинального wp_query
...
Спасибо, Krzysiek, но я хочу получить ID текущей страницы, а не ID записи блога.
Sodbileg Gansukh
OK, значит у тебя есть страница, которая содержит цикл пользовательских записей, и внутри этого цикла ты хочешь получить доступ к ID этой страницы?
Krzysiek Dróżdż
Вот код. ссылка
Sodbileg Gansukh
Просто определите переменную вне вашего пользовательского цикла для текущего ID записи, которую можно будет повторно использовать позже
passatgt
Но я не могу получить доступ к этой переменной внутри шаблона, который подключаю (в данном случае, content-custom.php)
Sodbileg Gansukh
Используйте обычный include вместо get_template_part: include(locate_template('content-custom.php')); Таким образом переменные передаются, и вы можете повторно использовать их в своем шаблоне.
passatgt
Здесь несколько плохих практик. 1. Не используйте обычный include (это очень плохая практика, которая ломает дочерние темы). 2. Не модифицируйте глобальный wp_query для создания пользовательских запросов. Используйте свой собственный экземпляр запроса (тогда вы сможете получить доступ к глобальному wp_query внутри этого цикла).
Krzysiek Dróżdż
Я уже поискал в Google перед тем, как написать здесь, и пробовал это. Это дает мне ID текущей записи блога, но не ID страницы внутри шаблона. Спасибо, shahpranaf.
Sodbileg Gansukh
Вот. ссылка
Sodbileg Gansukh
Решение 1: (Плохое решение)
$p = $GLOBALS['wp_the_query']->get_queried_object_id();
// $p будет содержать ID вашей страницы
Примечание: Никогда не следует использовать глобальный объект wp_the_query.
РЕДАКТИРОВАНИЕ: Если вы не изменяли глобальный объект wp_query (например, не использовали query_posts()), то решения helgatheviking будут работать:
get_queried_object_id();
или
$GLOBALS['wp_query']->get_queried_object_id();
Решение 2: Как предложил passatgt в комментариях, вы можете сохранить ID страницы вне цикла и получить к нему доступ внутри цикла. Проблема области видимости при доступе в файле части шаблона может быть решена объявлением переменной как глобальной.
// 1. В файле шаблона перед началом цикла
global $myglobal_page_id;
$myglobal_page_id = get_the_ID();
// здесь можно начинать цикл
get_template_part('content', 'custom');
// 2. В файле части шаблона
global $myglobal_page_id; // внутри цикла или в другом месте
// здесь будет доступен ID вашей страницы
Объяснение для Решения 1:
Когда вы находитесь внутри цикла, глобальный объект post устанавливается на текущую запись. Поэтому при вызове the_ID() или get_the_ID() (которая использует функцию get_post()), вы получите ID текущей записи, а не главной страницы.
Поэтому вам нужно обратиться к главному объекту wp_the_query (который является копией главного объекта запроса, используемого для сброса запроса, см. wp_reset_query()), так как он содержит ваш исходный запрос.
Хм, не думаю, что это сработает. В его коде модифицируется глобальная переменная $wp_query.
Krzysiek Dróżdż
это будет работать, вы будете напрямую обращаться к wp_the_query, это копия основного запроса, хранимая WordPress.
MortalViews
Это не является правильным ответом. Пожалуйста, отредактируйте ваш ответ и добавьте объяснение, что делает ваш код и как он работает
Pieter Goosen