Получение 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 за мисс викинг :)

Спасибо @PieterGoosen, но мне не пришлось далеко копать... это был первый результат в Google.

@helgatheviking Но это не сработает, так как он модифицирует глобальный объект $wp_query
. Я что-то упускаю?

@KrzysiekDróżdż Не думаю, что ты что-то упускаешь. Я не видел упоминания об этом в вопросе, и в любом случае, изменять глобальную переменную $wp_query
— плохая идея.

@helgatheviking Да, это плохая идея, но он всё равно это делает :)

@KrzysiekDróżdż Я всё ещё не вижу, где он говорит, что делает это? Но если автор вопроса решает игнорировать советы не изменять глобальные переменные, то он должен быть готов к тому, что некоторые основные функции могут работать не так, как ожидается.

@helgatheviking В комментарии: http://wordpress.stackexchange.com/questions/144471/getting-page-id-inside-loop/144484?noredirect=1#comment207844_144472

@KrzysiekDróżdż Я не интерпретирую этот комментарий как то, что он изменяет глобальные переменные, просто get_the_ID()
не возвращает то, что ему нужно. Думаю, мы не узнаем, пока автор вопроса не вернется, чтобы проверить мой ответ.

Если у кого-то есть решение работающей пагинации без использования основного запроса, пожалуйста, покажите мне. Я знаю, что вмешиваться в основной запрос — не круто, но я не могу получить работающую пагинацию без его использования.

@SodbilegGansukh Похоже, вы задаёте новый вопрос, и вам следует опубликовать его отдельно. В следующий раз объясните, что вы делаете с основным запросом, чтобы люди могли дать вам более точные советы/ответы. Я до сих пор не знаю, что именно вы делаете с основным запросом, поэтому не могу прокомментировать, но считаю, что ответил на изначально заданный вопрос.

Вы можете использовать все тегов шаблонов внутри этого файла, поэтому чтобы получить 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 записи блога.

OK, значит у тебя есть страница, которая содержит цикл пользовательских записей, и внутри этого цикла ты хочешь получить доступ к ID этой страницы?

Вот код. ссылка

Просто определите переменную вне вашего пользовательского цикла для текущего ID записи, которую можно будет повторно использовать позже

Но я не могу получить доступ к этой переменной внутри шаблона, который подключаю (в данном случае, content-custom.php)

Используйте обычный include вместо get_template_part: include(locate_template('content-custom.php')); Таким образом переменные передаются, и вы можете повторно использовать их в своем шаблоне.

Здесь несколько плохих практик. 1. Не используйте обычный include (это очень плохая практика, которая ломает дочерние темы). 2. Не модифицируйте глобальный wp_query
для создания пользовательских запросов. Используйте свой собственный экземпляр запроса (тогда вы сможете получить доступ к глобальному wp_query внутри этого цикла).

Я уже поискал в Google перед тем, как написать здесь, и пробовал это. Это дает мне ID текущей записи блога, но не ID страницы внутри шаблона. Спасибо, shahpranaf.

Вот. ссылка

Решение 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
.

это будет работать, вы будете напрямую обращаться к wp_the_query, это копия основного запроса, хранимая WordPress.

Это не является правильным ответом. Пожалуйста, отредактируйте ваш ответ и добавьте объяснение, что делает ваш код и как он работает
