Getting the wrong page ID

时间:2019-06-11 作者:Gonzalo

我正在开发一个主题,我需要获得实际的页面ID,当我这样做时:

global $post;
$thePostID = $post->ID;
我得到了错误的ID。我尝试了get\\u the\\u ID(),得到了与上面代码中相同的ID,但两者都是错误的。在获取ID之前,我还尝试执行wp\\u reset\\u query(),但仍然得到了相同的错误ID。我正在模板中运行上述代码,它不在循环中。我还想澄清一下,我正在尝试获取页面ID,而不是帖子ID,尽管函数似乎是相同的。我做错了什么,我该如何修复它?

**上下文

我一直在测试不同的建议,这里我将尝试澄清一些。没有显示正确页面ID的模板页面显示了我使用ACF创建的自定义字段的帖子。执行\\u ID()或其变体时获得的ID是自定义字段第一篇文章的第一个ID。在执行任何查询之前,我检索了模板标题上的ID,结果是相同的,而且当我重置查询时,ID不会更改。

有什么建议吗?

谢谢

4 个回复
最合适的回答,由SO网友:Hector 整理而成

如注释中所述,您正在尝试在分类法归档中获取ID(template-taxonomy.php) 它不是post对象,并且在数据库中没有记录。它只是试图显示一些帖子,当您使用get_te_ID() 在该存档页中的函数。

使用一些主题或插件,您可以创建一个页面并将其用作归档页面。在这种情况下get_the_ID() 函数能够返回实际的页面ID(循环外),因为它是一个真实的post对象,并且在数据库中有一个位置。

SO网友:MikeNGarrett

正如我在评论中提到的,获取帖子ID时,上下文很重要。

尝试使用get_queried_object() 根据url确定WordPress认为您正在尝试获取的内容。这将返回完整的对象,以便您更好地理解所查询的内容。

get_queried_object() 法典:

如果您在一篇文章中,它将返回post对象如果您在一个页面中,它将返回page对象如果您在存档页面中,它将返回post类型对象如果您在类别存档中,它将返回category对象如果您在作者存档中,它将返回author对象等。这将为您提供更多信息,以确定您是否有可用的页面ID,或者您是否需要查询页面以获取ID。

如果这是您要查找的对象,您可以使用get_queried_object_id() 检索ID。

SO网友:Trisha

---已更新---

好了,现在我对您正在做的事情有了更多的了解(查询CPT并使用模板文件将其显示在页面上),下面是我如何处理类似功能的:

在我的一个网站上,我有一个页面描述了在特定区域的徒步旅行,下面我查询了CPT“徒步旅行”的所有自定义帖子,这些帖子有一个自定义字段,其中保存了徒步旅行的(未来)日期(这是一个有计划日期的引导徒步旅行,还有一个供人们注册徒步旅行的表单)。

徒步旅行页面的模板文件开始于前面提到的

if (have_posts()) : while (have_posts()) : the_post();

然后是一些HTML,其中

the_content();

以便在页面上显示关于在该区域徒步旅行的通用措辞。

低于我使用的get_posts(); 获取即将进行的徒步旅行的所有CPT帖子,以便不显示以前的徒步旅行

    global $post;
    $args = array (
    \'post_type\' => \'hike\',
    \'meta_key\' => \'hike_date_start\',
    \'orderby\' => \'meta_value_num\',
    \'order\' => \'ASC\',
    \'posts_per_page\' => -1);

    $myposts = get_posts($args); 
    foreach ( $myposts as $post ) : setup_postdata( $post );

    $exp_date = strtotime(get_post_meta($post->ID,\'hike_date_start\',true));
    $today = time();
    if ($today <= $exp_date) {

    $hikedate = get_post_meta($post->ID,\'hike_date_start\',true);
    $hikedate2 = get_post_meta($post->ID,\'hike_date_end\',true);
    $hikedateend = strtotime(get_post_meta($post->ID,\'hike_date_end\',true));
    $hikerating = get_post_meta($post->ID,\'hike_rating\',true);
    $hikeleader = get_post_meta($post->ID,\'hike_leader\',true);
    $hikecontactph = get_post_meta($post->ID,\'hike_contact_phone\',true);
    $hikecontactem = get_post_meta($post->ID,\'hike_contact_email\',true);
    $hikedirections = get_post_meta($post->ID,\'hike_directions\',true);
下面是一些HTML,以我想要的格式显示数据,如下所示:

    <div class="hikeentry">
      <div class="time">
      <div class="month"><?php echo date(\'M\', $exp_date); ?></div>
      <div class="wkday"><?php echo date(\'l\', $exp_date); ?></div>
      <div class="day"><?php echo date(\'d\', $exp_date); ?></div>
      <div class="year"><?php echo date(\'Y\', $exp_date); ?></div>
   </div>
   <div class="hikedata">
     <h4><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h4>
     <div class="hikemeta">
     <div class="left">
     <span>Rating:</span> <?php echo $hikerating; ?><br />
     <span>Leader:</span> <?php echo $hikeleader; ?><br />
     <span>Contact:</span> <a href="mailto:<?php echo antispambot($hikecontactem); ?>"><?php echo antispambot($hikecontactem); ?></a> &nbsp;&nbsp; <?php echo $hikecontactph; ?> 
     </div>
    <div class="left bordered rounded bkgd"><a href="<?php the_permalink() ?>">Click here to read full<br />description and Sign Up</a>
    </div>
    </div>
    <?php the_excerpt(); ?>
    </div>
    </div><!-- end .hikeentry -->
此外,在完成foreach循环时,重置postdata也很重要,如下所示

    } endforeach; wp_reset_postdata();
因为我使用get_posts($args); 而不是wp_query(); 然后不需要重置查询,只需重置postdata即可。

我没有特别使用the_ID(); 但是您可以,在foreach循环中的任何需要它的地方,只需调用the_ID(); 因为它是使用setup_postdata();

我希望这能有所帮助,在评论中提出更多问题,我很高兴解释更多关于我如何/为什么使用这个。。。。。。我更喜欢使用WP内置方法来检索和使用数据,而不是ACF,但我喜欢ACF使我的用户可以轻松地输入自定义数据。:-)

---前面的答案,上面更新了--如果不了解您的具体用途,就很难确切知道如何给您提供建议,但如果我正确理解了您的问题,您是在为特定页面创建模板文件,是吗?

在这种情况下,在已添加页面并指定要使用的新模板的“页面>添加新”中,模板文件的顶部仍然需要:

if (have_posts()) : while (have_posts()) : the_post();

然后在需要使用ID的地方the_ID();

我使用它将页面的ID(在当前版本的WP中,无论出于何种目的,ID都与“post”相同,现在几乎所有内容都是“post”)分配给页面上的特定元素。

如果你能发布更多关于你正在努力实现的细节,这将有助于我们给你更好的建议。

SO网友:Manyang

您在另一个帖子出现或另一个循环后获得ID。

如果要获取原始主查询(当前页面ID)

使用此功能wp_reset_query, 在你拿到身份证之前

相关推荐

数组ID POST到函数HAVE_POST

作为主sql的结果,我得到了一个post ID数组,现在我需要该ID数组post来获取信息并以以下方式显示:<?php $ids = [1,2,3,4,5]; // Here is some execution or process // then I need to present the post as a normal loop if ( have_posts() ) : while ( have_post