Получение ID страницы внутри цикла

15 мая 2014 г., 11:09:42
Просмотры: 14.4K
Голосов: 2

У меня есть шаблон страницы, который содержит цикл для отображения записей блога. Внутри цикла используется функция get_template_part('content', 'custom') для подключения шаблона (content-custom.php), который выводит содержимое записи. Возможно ли получить ID текущей страницы внутри файла content-custom.php?

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

content-custom.php — это не страница, по сути это просто цикл, который вынесен из оригинального места в отдельный шаблон.

Pieter Goosen Pieter Goosen
15 мая 2014 г. 11:48:41

@PieterGoosen Да, ты прав. Но мне нужно получить ID страницы, которая подключает файл content-custom.php через метод get_template_part().

Sodbileg Gansukh Sodbileg Gansukh
15 мая 2014 г. 11:55:13

Зачем тебе ID страницы?

Pieter Goosen Pieter Goosen
15 мая 2014 г. 11:57:42
Все ответы на вопрос 4
10
10

Согласно этому ответу, вы можете использовать get_queried_object_id(), который пока ещё не добавлен в Codex, но связан с get_queried_object()

$page_id = get_queried_object_id();
15 мая 2014 г. 14:06:26
Комментарии

Ты действительно пошел далеко и пересек границы. +1 за мисс викинг :)

Pieter Goosen Pieter Goosen
15 мая 2014 г. 14:09:32

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

helgatheviking helgatheviking
15 мая 2014 г. 14:15:51

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

Krzysiek Dróżdż Krzysiek Dróżdż
15 мая 2014 г. 14:25:29

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

helgatheviking helgatheviking
15 мая 2014 г. 14:39:06

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

Krzysiek Dróżdż Krzysiek Dróżdż
15 мая 2014 г. 15:33:08

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

helgatheviking helgatheviking
15 мая 2014 г. 15:39:59

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

Krzysiek Dróżdż Krzysiek Dróżdż
15 мая 2014 г. 15:51:45

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

helgatheviking helgatheviking
15 мая 2014 г. 18:47:02

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

Sodbileg Gansukh Sodbileg Gansukh
16 мая 2014 г. 17:55:00

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

helgatheviking helgatheviking
16 мая 2014 г. 19:04:29
Показать остальные 5 комментариев
9

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

Спасибо, Krzysiek, но я хочу получить ID текущей страницы, а не ID записи блога.

Sodbileg Gansukh Sodbileg Gansukh
15 мая 2014 г. 11:36:12

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

Krzysiek Dróżdż Krzysiek Dróżdż
15 мая 2014 г. 12:09:29

Да, именно так...

Sodbileg Gansukh Sodbileg Gansukh
15 мая 2014 г. 12:10:36

Как выглядит этот пользовательский цикл?

Krzysiek Dróżdż Krzysiek Dróżdż
15 мая 2014 г. 12:12:18

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

Sodbileg Gansukh Sodbileg Gansukh
15 мая 2014 г. 12:19:30

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

passatgt passatgt
15 мая 2014 г. 12:21:04

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

Sodbileg Gansukh Sodbileg Gansukh
15 мая 2014 г. 12:28:15

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

passatgt passatgt
15 мая 2014 г. 12:30:02

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

Krzysiek Dróżdż Krzysiek Dróżdż
15 мая 2014 г. 13:45:59
Показать остальные 4 комментариев
5

Для получения ID страницы можно использовать глобальный объект post.


global $post;
echo "ID страницы: ".$post->ID;

Приведённый код возвращает ID текущей страницы, а не ID записи.

15 мая 2014 г. 11:43:38
Комментарии

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

Sodbileg Gansukh Sodbileg Gansukh
15 мая 2014 г. 11:46:08

можете предоставить ссылку на фронтенд?

shahpranaf shahpranaf
15 мая 2014 г. 11:48:33

К сожалению, не могу. Это на моем локальном компьютере.

Sodbileg Gansukh Sodbileg Gansukh
15 мая 2014 г. 11:50:01

НП. Можешь вывести printr $post здесь?

shahpranaf shahpranaf
15 мая 2014 г. 11:57:10

Вот. ссылка

Sodbileg Gansukh Sodbileg Gansukh
15 мая 2014 г. 12:01:12
5

Решение 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()), так как он содержит ваш исходный запрос.

15 мая 2014 г. 13:51:26
Комментарии

Хм, не думаю, что это сработает. В его коде модифицируется глобальная переменная $wp_query.

Krzysiek Dróżdż Krzysiek Dróżdż
15 мая 2014 г. 13:58:23

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

MortalViews MortalViews
15 мая 2014 г. 13:59:11

редактирую свой ответ, добавляя больше вариантов.

MortalViews MortalViews
15 мая 2014 г. 13:59:30

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

Pieter Goosen Pieter Goosen
15 мая 2014 г. 13:59:50

печатаю его.. :P

MortalViews MortalViews
15 мая 2014 г. 14:00:37