因为我在做研究的时候无意中发现了这条线索,但它并没有给我带来我想要的结果。因此,我决定在这里注册,以指出我获取具有多种帖子类型的帖子的需要的方法。
有一点是restAPI本身不接受多个post类型。我想这就是为什么getEntityRecords也不提供这种功能的原因。
1)我注册了一个新的RestAPI端点,以便在使用它时能够查询多个帖子类型:
//PHP
add_action( \'rest_post_query\', function( $args, $request ){
$post_types = $request->get_param( \'type\' );
if( ! empty( $post_types ) ){
if( is_string( $post_types ) ){
// filtering posttypes, seperated with comma into an array, ignoring square brackets
$post_types = explode( \',\', str_replace( array( \'[\', \']\') , \'\', $post_types ) );
foreach ( $post_types as $key => $post_type ){
$object = get_post_type_object( $post_type );
if( ! $object || ! $object->show_in_rest ){
unset( $post_types[ $key ] );
}
}
}
$args[ \'post_type\' ] = $post_types;
} else {
// fallback: no type defined, return post as default
$args[ \'post_type\' ] = \'post\';
}
return $args;
}, 10, 2 );
通过使用浏览器调用新的API端点,轻松检查它
https://*yoururl.com*/wp-json/wp/v2/posts?per_page=10&categories=0&type=posts,page
我不再使用古腾堡函数getEntityRecords来获取帖子。我选择了这种性能方面的方式,以避免多次调用getEntityRecords。
2)在我的古腾堡街区,我创建了一个钩子来调用:
export default function useFetchPosts( url ) {
const [data, setData] = useState( null );
useEffect(() => {
async function loadData() {
const response = await fetch( url );
if(! response.ok ) {
return false;
}
const posts = await response.json();
setData(posts);
}
loadData();
}, [url]);
return data;
}
3)要获得帖子,我只需在编辑块中这样称呼它:
// parsedCategories and
// parsedPostTypes have to set and parsed by you before ofcourse ;)
const numberposts = 10;
const postFields = \'&_fields=id,author,link,title,_links\';
const posts = useFetchPosts( \'https://\'+window.location.host+\'/wp-json/wp/v2/posts?per_page=\'+numberposts+\'&categories=\'+parsedCategories+\'&_embed=author&type=\'+parsedPostTypes+\'&orderby=date&order=desc\'+postFields );
查看restAPI参考以了解可用的参数和参数:
https://developer.wordpress.org/rest-api/using-the-rest-api/global-parameters/干杯