我正在用WP-API(v2)构建一个站点。我正试图add a REST field according to documentation 包括以下内容body_class
.
然而body_class
正在返回一个类(由我的主题添加的类)或没有类(当主题中添加类的条件为false时)。
以下是我的api.php
文件(包括通过functions.php
).
// Obtain body classes
function bsd_get_body_class( $data, $object, $request ) {
$classes = get_body_class();
return $classes;
}
// Obtain post classes
function bsd_get_post_classes( $data, $post, $request ) {
return get_post_class();
}
function bsd_rest_fields() {
register_rest_field([\'page\', \'post\'], \'body-class\', array(
\'get_callback\' => \'bsd_get_body_class\'
)
);
register_rest_field([\'post\'], \'post-classes\', array(
\'get_callback\' => \'bsd_get_post_classes\'
)
);
}
add_action( \'rest_api_init\', \'bsd_rest_fields\', 15 );
The
post_classes
该功能工作正常,我可以在我的状态下访问该数据;这个
body_classes
但事实并非如此。
使用body_class
在其他主题文件中效果很好——例如,body类应用于页面模板中。
有趣的是print_r(get_body_class())
在我的内部functions.php
文件还返回一个(或零个)类,但在模板文件中,它可以正常工作。
最合适的回答,由SO网友:bigsweater 整理而成
get_body_class()
依赖于$wp_query
这显然是JSON API的禁忌。
我考虑创建一个全局对象来保存body类,并使用它来保持body_class
最新的但如果不重新加载页面,这是行不通的,也不能保证对象是最新的。
我能让它远程工作的唯一方法就是劫持主管道$wp_query
对象,这是一个no-no。
半工作代码类似于:
function bsd_get_body_class($id) {
global $wp_query;
$wp_query = $orig_query;
$new_query = new WP_Query( array( \'p\' => $id, \'post_type\' => \'any\' ) );
$wp_query = $new_query;
$classes = get_body_class();
wp_reset_postdata();
$wp_query = $old_query;
return $classes;
}
// Add $classes as a REST field to the API according to docs
尽管如此,
$classes
不一定与的输出匹配
body_class()
在我的模板文件中,我认为这是因为它在查询中比在模板中发生得更早。
所以我放弃了它。
最后,我用JS编写了一个简单的类生成器,它重新创建了一些WP功能,而不是使用API并将类存储在我的应用程序状态中。看起来是这样的:
export const bodyClass = (data) => {
var classes = [];
if (data[\'id\'] && data[\'type\'])
classes.push(data[\'type\'] + \'-id-\' + data[\'id\']);
if (data[\'type\'])
classes.push(data[\'type\']);
if (data[\'is-front-page\'] === true)
classes.push(\'home\')
else
classes.push(\'internal\');
return classes;
}
如果有人知道从WP-API获取表示数据的好方法,我洗耳恭听,但经过几天的黑客攻击,我找不到可靠、一致的方法将类从
$wp_query
. (
post_classes
, 另一方面,它就像一种魅力。)