通过url检测页面类型(存档、单页、页面、作者...)

时间:2017-01-18 作者:Ramtin Gh

更新:非常简短的版本$wp_query 对于可以是任何内容的给定url(单个、页面存档、自定义帖子类型、作者、年份、月份等)?

TL;DR我需要一个函数,它可以根据给定的url返回此信息(作为REST API端点):

request:\'category/Uncategorized\'

response:
{
type:"category",
category_name:"uncategorized"
}

request:\'books/harry-potter\'

response:
{
type:"single",
post_type:"books",
name:"harry-potter"
}
因此,我的应用程序将知道使用哪种模板以及预期的数据类型。

说来话长,我正在用ReactJS编写一个Wordpress主题,我已经用react router设置了(已知)路由,但我需要检测如果请求的url目前未知,我应该期望什么样的内容。

如果url是通过浏览器获取的(而不是ajax调用),我会让我的wordpress模板文件在页面中插入所有必需的数据(使用$wp_query->query_vars), 所以,通过简单的url检查,我将知道数据是否用于当前url,如果是,我将使用它。

当用户通过调用各自的API端点来浏览和加载下一页时,就会出现问题。

如果我想支持所有permalink结构,情况会变得更糟,因此我想我肯定需要在后端解析URL以检查所有可能性。

因此,我有一个检测器js,它尝试检测是否可以检测请求的资源类型(通过检查url参数是否包含category,author,...) 并进行API调用,如果不能,它将调用检测器端点,我需要在其中告诉我的应用程序该在该页面中呈现什么。

例如,我目前注册了一个名为“Team”的自定义帖子类型,因此我已经知道如何处理mywebsite.com/team &;mywebsite.com/team/:slug, 但如果用户注册了一个新的帖子类型,比如“Books”,我的应用程序将不知道Books是一个页面的slug、post的slug还是一个帖子类型的存档名称。

1 个回复
SO网友:Vishal Kumar Sahu

你有rewrite_rules 在wp\\U选项表中。从那里,你的应用程序可以知道wordpress将来将要重写什么,以及在索引后将如何重写。php。您可以将JS中的正则表达式与wp\\U选项数据一起使用,以自定义应用程序响应。

更新

我需要一段代码来确定当前页面/帖子的性质,以便根据返回动态使用不同的模板-

if(!function_exists(\'get_nature_of_post\')):
function get_nature_of_post() { 
  global $wp_query;
  $wpq = json_decode(json_encode($wp_query),true);
  $check = array("is_single","is_page","is_archive","is_author","is_category","is_tax","is_search","is_home","is_404","is_post_type_archive");

  $page_identifiers = array_intersect_key($wpq,array_flip($check));
  $page_identifiers = array_filter($page_identifiers);
  $keys = array_flip(array_keys($page_identifiers));

  $case[\'home\'] = array_flip(array(\'is_home\'));
  $case[\'search\'] = array_flip(array(\'is_search\'));
  $case[\'archive\'] = array_flip(array(\'is_archive\',\'is_post_type_archive\'));
  $case[\'taxonomy\'] = array_flip(array(\'is_archive\',\'is_tax\'));
  $case[\'single\'] = array_flip(array(\'is_single\'));
  $case[\'page\'] = array_flip(array(\'is_page\'));

  $home = !array_diff_key($case[\'home\'], $keys) && !array_diff_key($keys, $case[\'home\']);
  $archive = !array_diff_key($case[\'archive\'], $keys) && !array_diff_key($keys, $case[\'archive\']);
  $search = !array_diff_key($case[\'search\'], $keys) && !array_diff_key($keys, $case[\'search\']);
  // var_dump($archive);
  $taxonomy = !array_diff_key($case[\'taxonomy\'], $keys) && !array_diff_key($keys, $case[\'taxonomy\']);
  // var_dump($taxonomy);
  $single = !array_diff_key($case[\'single\'], $keys) && !array_diff_key($keys, $case[\'single\']);
  // var_dump($single);
  $page = !array_diff_key($case[\'page\'], $keys) && !array_diff_key($keys, $case[\'page\']);
  // var_dump($page);

  switch (!false) {
    case $archive: return \'archive\'; break;
    case $taxonomy: return \'taxonomy\'; break;
    case $single: return \'single\'; break;
    case $page: return \'page\'; break;
    case $search: return \'search\'; break;
    case $home: return \'home\'; break;
    default: return false;
  }
}
endif;

相关推荐

Php致命错误:无法将WP_REST_RESPONSE类型的对象用作wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php中

我向WordPress添加了一个自定义端点,如下所示: add_action( \'rest_api_init\', function () { register_rest_route( \'menc/v1\', \'/crosscat/(?P[\\w-]+)/(?P[\\w-]+)\', array( \'methods\' => \'GET\', \'callback\' => \'dept_cat_api\',&#x