WordPress认为我的定制路线是404

时间:2016-06-01 作者:Ahrengot

我创建了一个插件,用于设置自定义路由,然后加载该url的模板文件。一切正常,除了WordPress似乎认为它是404,尽管它正确地呈现了我的模板。

例如,文档标题中显示404error404 类添加到<body>

自定义url为域。com/path/:id其中:id 是与帖子id相对应的动态值,因此URL可以是域。com/path/275。在下面的示例中some_id 用作post id变量。

以下是我的插件的简化版本:

<?php

class MyPlugin {
  public function __construct() {
    add_action( \'init\', array($this, \'add_response_endpoint\') );
    add_filter( \'template_include\', array($this, \'add_response_template\') );
  }

  public function add_response_endpoint() {
    add_rewrite_rule(
      \'^path/([0-9]+)/?\',
      \'index.php?pagename=my_custom_url&some_id=$matches[1]\',
      \'top\'
    );

    add_rewrite_tag(\'%some_id%\', \'([^&]+)\');
  }

  public function add_response_template($template) {
    if ( get_query_var( \'pagename\' ) === \'my_custom_url\' ) {
      $template = trailingslashit( dirname( __FILE__ ) ) . \'templates/custom-page-template.php\';
    }

    return $template;
  }
}

new MyPlugin();
我错过什么了吗?或者我应该开始在其他地方寻找这个bug?

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

手动设置is_404 = false; 修复了我的问题。然而,我不确定这是最好的方法。我试着用pre_get_posts 过滤,而不是没有任何运气。

无论如何,对于同一条船上的任何其他人,你可以这样做来摆脱404状态:

public function add_response_template($template) {
  global $wp_query;
  if ( \'my_custom_url\' === get_query_var( \'pagename\' ) ) {
    $wp_query->is_404 = false;
    $template = trailingslashit( dirname( __FILE__ ) ) . \'templates/custom-page-template.php\';
  }

  return $template;
}
以及更新文档标题(其中的内容<title><head> (第节)这里有一个代码片段,可以让它很好地工作。

add_filter( \'document_title_parts\', function($title_arr) {
  if ( \'my_custom_url\' === get_query_var(\'pagename\') ) {
    $title_arr[\'title\'] = "Document title for my custom route";
  }

  return $title_arr;
}, 10, 1 );
如果有人知道更好的方法,请告诉我。

SO网友:2046

我还没有在WP中找到足够成熟的定制路线。我建议您使用Timber docs中提到的3种路线解决方案中的任何一种。https://timber.github.io/docs/v2/guides/routing/

如果使用反状态库(https://github.com/Upstatement/routes) 您将执行以下操作:

Routes::map(\'info/:name/page/:pg\', function($params){
    //make a custom query based on incoming path and run it...
    $query = \'posts_per_page=3&post_type=\'.$params[\'name\'].\'&paged=\'.intval($params[\'pg\']);

    //load up a template which will use that query
    Routes::load(\'archive.php\', null, $query, 200);
});
请参阅Routes::load中的200,它发送正确的标头。

如果您需要更通用的东西,请使用Rareloop路由器https://github.com/Rareloop/router

相关推荐

Force pretty permalinks?

我正在构建一个插件,该插件将用于单个站点,并依赖于add_rewrite_rule 要工作,需要打开永久链接。打开它们并不困难,因为它只是一个站点,但我担心其中一个管理员可能会在不知道自己在做什么的情况下关闭它,并破坏该站点。如何以编程方式强制保持漂亮的永久链接?