【问题标题】:WordPress Get the Page ID outside the loopWordPress 在循环外获取页面 ID
【发布时间】:2011-03-08 19:54:31
【问题描述】:

我想在 WordPress 中开始循环之前获取页面 ID。我正在使用

$page = get_query_var('page_id');

显然,它什么也不返回。

我只是想检查一个页面的 ID 并基于它向<body> 标签添加一个类。

【问题讨论】:

标签: php wordpress


【解决方案1】:

如果您使用漂亮的永久链接,get_query_var('page_id') 将不起作用。

改为从全局$wp_query获取查询的对象ID

// Since 3.1 - recommended!
$page_object = get_queried_object();
$page_id     = get_queried_object_id();


// "Dirty" pre 3.1
global $wp_query;

$page_object = $wp_query->get_queried_object();
$page_id     = $wp_query->get_queried_object_id();

【讨论】:

  • 非常适合漂亮的永久链接。我使用了全局 $post;回声 $post->ID;但没有奏效。谢谢!
  • get_queried_object_id(); 为我返回 0。我认为问题在于我在自定义查询之后调用它。我想要实际的页面 ID。
  • 奇怪,get_queried_object(); 对我不起作用,但$wp_query->get_queried_object(); 对...我看了一下get_queried_object();,它和后者一样。
  • 可能是您的变量范围 - 您是否使用自定义查询覆盖了 $wp_query
  • 请注意,如果在类别页面上,get_queried_object_id() 返回类别 ID,因为没有页面 ID。
【解决方案2】:

您还可以创建一个通用函数来获取帖子的 ID,无论是在循环外部还是内部(处理这两种情况):

<?php

/**
 * @uses WP_Query
 * @uses get_queried_object()
 * @see get_the_ID()
 * @return int
 */
function get_the_post_id() {
  if (in_the_loop()) {
       $post_id = get_the_ID();
  } else {
       global $wp_query;
       $post_id = $wp_query->get_queried_object_id();
         }
  return $post_id;
} ?>

然后简单地做:

$page_id = get_the_post_id();

【讨论】:

    【解决方案3】:

    改用这个全局 $post:

    global $post;
    echo $post->ID;
    

    【讨论】:

    • 这只会在循环之后起作用,而不是之前,因为$post在启动“循环”时被初始化。
    • @ChristianDavén - 这不是真的。此代码适用于 page.php 的开头
    【解决方案4】:

    如果您以任何方式搜索该主题是因为帖子页面(使用静态首页时的索引页面替代),那么正确答案是:

    if (get_option('show_on_front') == 'page') {
        $page_id = get_option('page_for_posts');
        echo get_the_title($page_id);
    }
    

    (取自Forrst | Echo WordPress "Posts Page" title - Some code from tammyhart

    【讨论】:

      【解决方案5】:

      如果您在一个页面上并且这不起作用:

      $page_object = get_queried_object();
      $page_id     = get_queried_object_id();
      

      您可以尝试使用 PHP 手动构建永久链接,以便查找帖子 ID:

      // get or make permalink
      $url = !empty(get_the_permalink()) ? get_the_permalink() : (isset($_SERVER['HTTPS']) ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
      $permalink = strtok($url, '?');
      
      // get post_id using url/permalink
      $post_id = url_to_postid($url);
      
      // want the post or postmeta? use get_post() or get_post_meta()
      $post = get_post($post_id);
      $postmeta = get_post_meta($post_id);
      

      它可能无法捕获所有可能的永久链接(尤其是因为我删除了查询字符串),但您可以对其进行修改以适合您的用例。

      【讨论】:

        【解决方案6】:

        您可以在循环外使用is_page($page_id) 进行检查。

        【讨论】:

        • 我不想查看页面,我想获取当前页面的ID。
        • @atif 你确定页面 ID 实际上正在传递吗?你不是在头版吗?
        【解决方案7】:

        此函数从当前页面获取 id。

        get_the_ID();
        

        【讨论】:

        • 嗯...这仅适用于in the loop返回当前帖子的数字 ID。 此标签必须在循环内。
        • @drzaus 实际上这确实在循环之外工作......检查一下。
        • @hitautodestruct 虽然您在技术上是正确的,它可以在循环之外工作,但这不是可靠的用法——这是从个人经验以及查看源代码得出的。底层方法get_post 恰好使用了$GLOBALS['post'],它可能在某个时候被填充,但不能保证除非/直到你在循环中。
        【解决方案8】:

        使用下面两行代码获取当前页面或帖子ID

        global $post;
        echo $post->ID;
        

        【讨论】:

          【解决方案9】:

          我已经通过以下方式完成了它,它对我来说非常有效。

          首先在 header.php 中声明一个全局变量,在它更改之前分配帖子或页面的 ID,因为 LOOP 为其分配了显示的最后一个条目的 ID:

          $GLOBALS['pageid] = $wp_query-&gt;get_queried_object_id();

          并在模板中的任何地方使用,例如在footer.php中:

          echo $GLOBALS['pageid];

          【讨论】:

            【解决方案10】:

            这是正确的代码。

            echo $post->ID;
            

            【讨论】:

              【解决方案11】:

              如果你脱离了 WordPress 的循环,你不能使用任何 wordpress 的方法,所以你必须使用纯 php。

              您可以使用此代码。肯定会帮助你:)

              $page_id = @$_GET['page_id'];
              
              if (!is_numeric($page_id)) {
                  // Then the uri must be in friendly format aka /my_domain/category/onepage/
                  // Try this
                  //$path = '/www/public_html/index.php/';
                  ///$path = '/my_domain/category/onepage/';
                  $path = $_SERVER['REQUEST_URI'];
                  // Clean the uri
                  //$path = str_replace('/', '', $page);
                  $path = str_replace('.php', '', $path);
                  //$path = str_replace('?s=', '', $path);
                  $path = $path ? $path : 'default';
              
                  $path_len = strlen($path);
                  $last_char = substr($path, $path_len -1);
                  //echo $last_char;
                  $has_slash = strpos($last_char, "/");
                  //echo $has_slash;
                  if ($has_slash === 0) :
                      $path = substr($path, 0, $path_len -1);
                  elseif ($has_slash === null) :
                      $path = substr($path, 0, $path_len);
                  endif;
                  //echo "path: ".$path; // '/www/public_html/index'
                  $page = substr(strrchr($path, "/"), 1);
                  echo "page: ".$page; // 'index'
              }
              
              $my_page_id = 31;
              $my_page = 'mypage';
              
              //echo "page: ".$page;
              //echo "page_id ".$page_id;
              if($page_id == $my_page_id || $page == $my_page) 
              {
                  // your stuff....
              }
              

              享受吧!

              【讨论】:

              • 也许......您能否提供更多详细信息并告诉我您的解决方案?
              • 你写了 50 行代码来获取 $post-&gt;ID 中已经存在的变量。即使您不在循环中,也可以使用很多很多 Wordpress 功能。不是必须在循环中使用的少数几个。
              • 好吧,如果你删除注释代码,我写了 20 行。这些台词在我学习 wordpress 的过程中节省了我的时间。您写了 3 行,但是当您在循环之外时,您没有为 OP 问题提供任何解决方案。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2016-03-05
              • 1970-01-01
              • 2018-09-25
              • 1970-01-01
              • 1970-01-01
              • 2020-04-17
              • 1970-01-01
              相关资源
              最近更新 更多