WP-API中的Body_Class REST字段

时间:2016-03-14 作者:bigsweater

我正在用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 );
Thepost_classes 该功能工作正常,我可以在我的状态下访问该数据;这个body_classes 但事实并非如此。

使用body_class 在其他主题文件中效果很好——例如,body类应用于页面模板中。

有趣的是print_r(get_body_class()) 在我的内部functions.php 文件还返回一个(或零个)类,但在模板文件中,它可以正常工作。

1 个回复
最合适的回答,由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, 另一方面,它就像一种魅力。)

相关推荐

Teme.json会被缓存吗?我怎么才能清除它呢?

我用一个主题设置了一个主题。json文件,现在我想对其进行一些更改。我无法进行更改。。。我在当地工作。我猜这是缓存问题,但我不知道如何清除它。我安装了WP Rest缓存插件,用它来清除Rest缓存不起作用。我停用了它,仍然没有看到变化</我读到,切换当前主题可能会奏效,但事实并非如此</我正在使用wp-rig,当我渲染生产主题并切换到该主题时,我确实看到了我的更改。当我切换回工作副本时,仍然没有更改还有其他人遇到过这个吗?