WP JSON list all permalinks

时间:2018-12-31 作者:Jacksonkr

Scenario

我正在考虑编写一个自定义的wp json端点,以列出我的wordpress中每个帖子的所有永久链接。

Question

是否可以使用rest查询+筛选器来完成此操作?例如:。http://wpsite.com/wp-json/wp/v2/posts?filter[only-permalinks]

当前的解决方案最后我编写了一个自定义端点,代码如下:

添加到函数的底部。php

function get_all_slugs() {
    $posts = get_posts( array(
        \'numberposts\' => -1,
        \'post_type\' => "screen",
    ) );

    if ( empty( $posts ) ) {
        return null;
    }

    $posts_data = array();

    foreach( $posts as $post ) {
        $id = $post->ID; 
        
        $posts_data[] = (object) array( 
            \'id\' => $id, 
            \'slug\' => $post->post_name, 
            //\'title\' => $post->post_title,
        );
    }

    return $posts_data;
}
add_action( \'rest_api_init\', function () {
    register_rest_route( \'row/v1\', \'/all-slugs\', array( // /(?P<post_type>\\d+)\', array(
        \'methods\' => \'GET\',
        \'callback\' => \'get_all_slugs\',
    ) );
} );

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

是否可以使用rest查询+筛选器来完成此操作?例如:。http://wpsite.com/wp-json/wp/v2/posts?filter[only-permalinks]

是,从4.9.8开始(参见#43874) 可以只渲染_fields 参数

示例仅渲染永久链接:

https://example.com/wp-json/wp/v2/posts?_fields=link

[ 
    {
        link: "https://example.com/foo/"
    },
    {
        link: "https://example.com/bar/"
    },
]
仅渲染后期ID和永久链接:

https://example.com/wp-json/wp/v2/posts?_fields=id,link

[ 
    {
        id: 123,
        link: "https://example.com/foo/"
    },
    {
        id: 234,
        link: "https://example.com/bar/"
    },
]
仅渲染后期ID和段塞:

https://example.com/wp-json/wp/v2/posts?_fields=id,slug

[ 
    {
        id: 123,
        slug: "foo"
    },
    {
        id: 234,
        slug: "bar"
    },
]
获取所有可用项当前我们必须通过分页获取所有可用项,如:

https://example.comwp-json/wp/v2/posts?_fields=slug&per_page=100&page=1
https://example.comwp-json/wp/v2/posts?_fields=slug&per_page=100&page=2
...
在哪里per_page 默认值为10,最大值为100。

如果项目数超过可用资源,则在单个请求中获取所有项目可能会导致致命错误。

门票#43998 允许未绑定的请求(类似per_page=-1) 对于已登录的用户,已关闭为wontfix,因为它无法扩展并且存在性能问题。

有张票#45140 增加的上限per_page 数百人。

通常不需要在用户界面中显示这么多项目,而且存在javascript技术来处理分页。

如果确实需要更多,那么可以通过rest_{$post_type}_query 覆盖的最大默认值posts_per_page, 如果超出可用资源,则有发生致命错误的风险。

SO网友:Justin Waulters

我认为没有一个默认端点可以让您获取所有帖子并只返回永久链接。

您可以使用posts endpoint获取大块永久链接(我认为它不会让您在一个请求中返回所有永久链接),并对请求分页。要使其仅返回永久链接,可以使用json_prepare_post 筛选所有作为this 辅导的

然而,如果您必须在一次返回中包含所有永久链接,那么最有效的方法是添加一个新端点,如所述here. 在回调函数中,可以执行以下操作this 但不是echo将permalinks放在一个阵列中,json_encode() 数组,然后返回它。

由于这可能会成为一个有很多帖子的怪兽流程,我建议使用Transient API 要存储请求,请选择分页并使用posts 终结点或返回具有自定义终结点的所有内容。

相关推荐

Plain permalinks not working!

对于我的wordpress网站,普通永久链接不起作用。帖子url正在更改,但当我们单击帖子时,它不会重定向到帖子页面。它将出现在主页上。例如:http://example.com/?p=14523 如果我将永久链接更改为其他自定义格式,它将正常工作并显示帖子页面。例如:http://example.com/2018/09/01/postname/ 我尝试创建一个新的.htaccess 将永久链接更改为普通后的文件。仍然不工作。