source

워드프레스 API json, 한 번의 게시물에서 사전 게시물과 다음 게시물을 얻는 방법은?

factcode 2023. 9. 26. 22:35
반응형

워드프레스 API json, 한 번의 게시물에서 사전 게시물과 다음 게시물을 얻는 방법은?

단일 게시물 워드프레스 API에서 사전 및 다음 게시물을 얻는 방법, 이것을 얻을 수 없습니다. API 없이 워드프레스에서 json 사전 및 다음을 만드는 방법 저는 다음 사전에 사용할 수 있는 슬러그 게시물을 얻고 싶습니다. 다음 사전에 단일 게시물에서 사용할 수 있는 슬러그, 링크 또는 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

파티에 좀 늦었지만, 여기 답이 있습니다.

저는 REST API가 테마에 사용 가능한 PHP API와 다르다는 @Chris의 답변에 동의하지만, 때로는 데이터에서 동일한 프론트엔드를 구축하기도 합니다.

블로그에 다음 게시물과 이전 게시물에 링크를 표시하고 싶다면 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"
    },
    ...
  }
]

"휴식" 환경에서는 말이 안 되기 때문에 워드프레스 API는 이것을 제공하지 않는다고 99% 확신합니다.

많은 워드프레스의 오래된 기능들은 삶을 좀 더 편안하게 하기 위한 목적으로 (이전_post_link와 같이) a) 가정을 하는 것 (순서대로 게시물이 나열된 블로그를 구축하는 것)과 b) 자신의 사양을 구성하는 것으로 일종의 작업을 할 수 있습니다.

Rest를 도입함으로써(그리고 그것이 Rest-ish라고 주장할 수 있게 됨으로써) 관계로 구체적으로 정의되지 않는 한 이전/다음 요소를 참조하는 것은 큰 의미가 없을 것입니다.예를 들어, "비행기" 휴게소 엔드포인트가 승객들의 관계로 귀를 기울이는 것은 타당합니다./api/planes/f0556/passengers그러나 상황이 바뀔 수 있기 때문에 다음/이전 비행기를 타는 것은 말이 되지 않습니다(다음 출발 비행기입니까? 도착해야 합니까?).

대신에, 당신은 다음과 같은 질문을 할 필요가 있을 것입니다./api/planes/(인덱스) 엔드포인트를 사용하면 양쪽 항공편을 모두 얻을 수 있고 필요한 것을 선택할 수 있습니다.

저도 같은 문제에 직면해 있었습니다.워드프레스 기능을 수정하지 못했습니다.그래서 REST API로 솔루션을 구축해야 했습니다.

핵심은 root post id를 얻고 이 root post 직후/이전에 게시된 post를 얻는 것이었습니다.

해결책은 다음과 같습니다.

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]);
}

언급URL : https://stackoverflow.com/questions/42546957/wordpress-api-json-how-to-get-prev-and-next-posts-in-single-post

반응형