$ post-> ID не работает

У меня есть следующий код, и хотя get_the_ID () работает, $ post-> ID не делает, почему?

$the_query = new WP_Query( array( 'post_type' => 'custompost', ) ); while ( $the_query->have_posts() ) : $the_query->the_post(); echo $post->ID; endwhile; 

Solutions Collecting From Web of "$ post-> ID не работает"

Ваш цикл WP_Query является неполным. Не было обнаружено, что вы не проверяли, действительно ли были обнаружены какие-либо сообщения перед циклом, и вы не представляете сообщение, чтобы показать, что ничего не найдено, и вы не очищаетесь впоследствии. Вы также используете «другой» синтаксис, который нарушает согласование фигурных скобок в среде IDE, что делает вашу жизнь сложнее.

Попробуйте добавить global $post; как это:

 global $post; $the_query = new WP_Query( array( 'post_type' => 'custompost' ) ); if($the_query->have_posts()){ while ( $the_query->have_posts() ) { $the_query->the_post(); echo $post->ID; } wp_reset_postdata(); }else { echo 'no posts found'; } 

Когда вы пишете запросы, важно быть последовательными и делать все правильно. Поэтому я рекомендую прочитать эти слайды Andrew Nacin, разработчика WordPress Core на Auttomatic:

http://www.slideshare.net/andrewnacin/you-dont-know-query-wordcamp-netherlands-2012

Это скажет вам, где подходит каждый тип запроса, как они должны использоваться и почему.

В приведенном выше коде я добавил оператор if, чтобы проверить, были ли возвращены какие-либо сообщения, и я добавил wp_reset_postdata, что позволит вам продолжать использовать основной запрос, очистив его после пользовательского цикла.

Трюк, идентифицированный Томом Новеллем, заключается в том, чтобы добавить ссылку на global $post .

При запуске the_query->the_post() WordPress загружает первый результат запроса в глобальный объект $post . Вот как это настраивает все обычные теги шаблона:

  • the_title()
  • the_content()
  • the_excerpt ()
  • и т.д …

Вы видите, что мы ничего не передаем этим функциям. Мы просто позвоним им. Каждая из этих функций будет внутренне ссылаться на глобальный объект $post , чтобы анализировать, готовить и печатать желаемый результат.

Внутри цикла вы вызываете the_post() просто отлично, чтобы заполнить данные, но у вас нет ссылки на сами данные в пределах области вашего цикла. Если вы хотите избежать ссылки на глобальный объект $post , вместо этого вы можете использовать get_the_ID() .

Как и другие теги шаблонов, на которые я ссылался выше, get_the_ID() вызывает данные из глобального объекта $post внутри, поэтому вам не нужно делать это самостоятельно.

Но если вы действительно хотите сделать это самостоятельно, просто добавьте глобальную ссылку, прежде чем пытаться использовать $post :

 $the_query = new WP_Query( array( 'post_type' => 'custompost', ) ); while ( $the_query->have_posts() ) : $the_query->the_post(); global $post; // Add this line and you're golden echo $post->ID; endwhile; 

Что такое wp_reset_postdata() ?

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

В принципе, the_post() установит глобальный объект $post для получения данных для запрошенного запроса. the_query->the_post() перезапишет $post данными из the_query . wp_reset_postdata() сбросит $post в исходный запрос.

Поэтому, если вы используете вложенные или множественные циклы, wp_reset_postdata() – это способ вернуться к циклу и объекту $post который у вас был доступен до того, как вы вызвали вторичный the_query->the_post() .