【问题标题】:Wordpress API json, how to get prev and next posts in single post?Wordpress API json,如何在单个帖子中获取上一篇和下一篇文章?
【发布时间】:2017-03-02 04:36:35
【问题描述】:

如何在单个帖子 wordpress api 中获取上一篇和下一篇文章,我无法得到这个,如何在没有 API 的情况下在 wordpress 中制作 json prev 和 next 我想获得 slug 帖子我可以在单个帖子中使用 next prev,如何为 next 和 prev 获取 slug、链接或 id 帖子

<?php
$prev_post = get_previous_post();
if (!empty( $prev_post )): ?>
  <a href="<?php echo $prev_post->guid ?>"><?php echo $prev_post->post_title ?></a>
<?php endif ?>

像这样但在json中使用https://codex.wordpress.org/Function_Reference/previous_post_link

【问题讨论】:

  • 运气好吗?我在同一条船上。

标签: json wordpress api wp-api


【解决方案1】:

聚会有点晚了——但这里有一个答案。

虽然我同意 @Chris 的回答,即 REST API 与可用于主题的 PHP API 不同,但有时我们仍会根据数据构建相同的前端,对吧?

如果我想在我的博客上显示下一篇和上一篇文章的链接,我不想向 API 发送 3 个请求。

作为解决方案,我将其包含在我的插件中,其中包含针对特定项目的 API 调整:

// Add filter to respond with next and previous post in post response.
add_filter( 'rest_prepare_post', function( $response, $post, $request ) {
  // Only do this for single post requests.
  if( $request->get_param('per_page') === 1 ) {
        global $post;
        // Get the so-called next post.
        $next = get_adjacent_post( false, '', false );
        // Get the so-called previous post.
        $previous = get_adjacent_post( false, '', true );
        // Format them a bit and only send id and slug (or null, if there is no next/previous post).
        $response->data['next'] = ( is_a( $next, 'WP_Post') ) ? array( "id" => $next->ID, "slug" => $next->post_name ) : null;
        $response->data['previous'] = ( is_a( $previous, 'WP_Post') ) ? array( "id" => $previous->ID, "slug" => $previous->post_name ) : null;
  }

    return $response;
}, 10, 3 );

这会给你这样的东西:

[
  {
    "ID": 123,
    ...
    "next": {
      "id": 212,
      "slug": "ea-quia-fuga-sit-blanditiis"
    },
    "previous": {
      "id": 171,
      "slug": "blanditiis-sed-id-assumenda"
    },
    ...
  }
]

【讨论】:

    【解决方案2】:

    我 99% 肯定 Wordpress API 不提供此功能,因为它在“Rest”环境中毫无意义。

    许多 Wordpress 的旧功能旨在让生活更轻松(例如 previous_post_link),并且可以通过以下方式工作:a)做出假设(您正在构建一个按顺序列出帖子的博客)和 b)制定自己的规范。

    通过引入 Rest(并且能够声称它是 Rest-ish),引用上一个/下一个元素没有多大意义,除非它被明确定义为关系。例如,“飞机”休息端点将乘客作为一种关系来监听是有意义的:/api/planes/f0556/passengers,但下一个/上一个航班没有意义,因为上下文可能会改变(是下一个起飞的航班吗?到达?)。

    相反,您需要查询/api/planes/(索引)端点以获取该端点任一侧的所有航班,并挑选出您需要的内容。

    【讨论】:

      【解决方案3】:

      我也遇到了同样的问题。我无法修改 wordpress functions.php,所以我必须使用 REST API 构建一个解决方案。

      关键是获取根帖子 ID 并获取在此根帖子之后/之前发布的帖子。

      这是我的解决方案:

      public function getAdjacentPost(Post $post, string $direction = WordPressApi::ADJACENT_RIGHT): ?Post
      {
          //$dateEdge = $post->getCreatedAt()->format(\DateTimeInterface::ISO8601);
          $dateEdge = $post->getCreatedAt()->format('Y-m-d H:i:s');
          $query = [
              'exclude'  => $post->id,
              'per_page' => 1,
              'orderby'  => 'date',
          ];
          switch ($direction) {
              case WordPressApi::ADJACENT_RIGHT:
                  $query['order'] = 'asc';
                  $query['after'] = $dateEdge;
                  break;
              case WordPressApi::ADJACENT_LEFT:
                  $query['order'] = 'desc';
                  $query['before'] = $dateEdge;
                  break;
              default:
                  throw new \InvalidArgumentException(sprintf('Invalid direction: %s!', $direction));
          }
      
          $posts = $this->client->requestArray('posts', $query);
          return count($posts) === 0
              ? null
              : new Post($posts[0]);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-17
        • 2019-11-14
        • 1970-01-01
        • 1970-01-01
        • 2015-06-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多