最不幸的是,虽然我最初的解决方案很优雅,但我没有预见到这种复杂性,因此给您带来的不便,我深表歉意。
因此,我提供了另一种解决方案。
Firstly to get your fancy search query:
您的标记需要更改,但这将截获URL并在内部正确重写它们,它与其他答案类似,但更漂亮、更快、更易于阅读,而且只需一个函数
function custom_rewrite( $wp_rewrite ) {
    $feed_rules = array(
        \'search/(.+)/(.+)\'      =>  \'index.php?post_type=\'.$wp_rewrite->preg_index(1).\'&s=\' . $wp_rewrite->preg_index(2)
    );
    $wp_rewrite->rules = $feed_rules + $wp_rewrite->rules;
}
// refresh/flush permalinks in the dashboard if this is changed in any way
add_filter( \'generate_rewrite_rules\', \'custom_rewrite\' );
 因此
example.com/search/post/bannana 将在所有“post”类型的帖子中搜索bannana。
如果您不希望“搜索”,而是希望显示一个术语,那么只需修改重写规则中的查询变量即可。
您可以使用monkeyman rewrite rules Analyzer插件来帮助您,方法是输入URL并显示哪个重写规则处理它以及所述规则的优先级/顺序
BUT
然而,您将无法使用优雅的html标记来使用这些URL,它将无法很好地发挥作用,您将需要修改表单提交到的位置,这意味着虽然这听起来可能是一个很棒的想法,但在实践中,实现意味着您将需要至少1个重定向,以便搜索框使用这些URL,这一点都不理想。
For your species search problem
还要修改物种登记,使其更加具体/准确:
$args = array(
  \'labels\' => $labels,
  \'public\' => true,
  \'publicly_queryable\' => true,
  \'exclude_from_search\' => false, // lets not guess what this will be, lets be authorative
  \'show_ui\' => true,
  \'show_in_menu\' => true,
  \'query_var\' => true,
  \'has_archive\' => true,
  \'capability_type\' => \'post\',
  \'has_archive\' => true,
  \'hierarchical\' => false,
  \'menu_position\' => 5,
  \'menu_icon\' => $this->plugin_url . \'images/fish20.png\',
  \'supports\' => array(\'author\',\'thumbnail\',\'excerpt\',\'comments\',\'revisions\')
);
 但是,虽然这可能会解决问题,但我怀疑不会。重读你的问题,我看到它重写为/搜索/术语,但WordPress默认情况下不会这样做。我怀疑您在其他地方有代码可以将搜索词重写为更漂亮的版本,用于一般的帖子搜索,但这是一种干扰,无论是因为它在代码中添加的顺序还是其他原因。
由于我看不到您的整个代码库,而且我也不确定这个搜索代码修饰是什么样子的,所以我只能为您指出它的方向(如果没有设置post\\u类型,则会有条件地重写,而不是总是这样)。
edit: give this a try:
function custom_rewrite( $wp_rewrite ) {
    $feed_rules = array(
        \'species/(.+?)(/[0-9]+)?/?$\'      =>  \'index.php?post_type=species&species=\'.$wp_rewrite->preg_index(1).\'&page=\'.$wp_rewrite->preg_index(2)
    );
    $wp_rewrite->rules = $feed_rules + $wp_rewrite->rules;
}
// refresh/flush permalinks in the dashboard if this is changed in any way
add_filter( \'generate_rewrite_rules\', \'custom_rewrite\' );