添加_重写_规则,以及如何以正确的方式将自定义帖子放入worpress循环

时间:2016-12-17 作者:user3361559

我有一个带有自定义posttype“speaker”的插件,可以通过普通的permalink访问该插件domain.tld/speaker/speaker-name.

在里面addidtion 我想使用另一个url访问相同的说话人姓名:

domain.tld/slp/speaker-name

因此,我使用rewrite\\u规则来屏蔽原始url:

add_rewrite_rule(\'slp\\/(.*)\', \'index.php?slp=$matches[1]\', \'top\');
我知道我可以简单地将其重写为原始的permalink,但重要的是用户不能看到原始的permalink。

下一步,我将“slp”添加到queryvars中:

add_filter(\'query_vars\', \'queryvars\' );
function queryvars( $qvars ){
  $qvars[] = \'slp\';
  return $qvars;  
} 
使用add\\u操作(“parse\\u request”…)我试图获得控制权,只需将一个带有正确帖子的查询返回到Wordpress,希望它能正常工作:

add_action("parse_request", \'action_handler\'); 
function action_handler($wp) {

  if (isset($wp->query_vars["slp"]))   {
      global $wp;
      $speaker_name = $wp->query_vars["slp"]; 
      ... some magic to get the $speaker_id as their is additional logic needed ...
      return query_posts(\'p=\'.$speaker_id.\'&post_type=speaker\');
  }
}
起初看起来一切都很顺利。。我可以用这两个URL打开演讲者帖子,但在细节上,我似乎“混淆”了wordpress的流程:(

对于exmaple:如果使用重写url打开此函数,则此函数不起作用。它在$帖子中保留了第一篇博客帖子(“Hello World”),而不是发言人帖子:(

function add_meta() {
  global $post;
  if (get_post_type($post) != "speaker") return;
  echo \'<meta name="robots" content="noindex, nofollow">\';
}
add_action(\'wp_head\', \'add_meta\');
我怎样才能将说话人的帖子正确地放入正常的Wordpress循环中?这样其他插件(如Yoast)就可以正常工作了?

Milo提供的解决方案:

add_action("parse_request", \'action_handler\'); 
function action_handler($wp) {

  if (isset($wp->query_vars["speaker"]))   {
      $speaker_name = $wp->query_vars["speaker"];

      ... some magic to get the $post_name as their is additional logic needed ...
      $wp->query_vars["speaker"] = $post_name;
  }
}
谢谢你Milo

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

问题是,在分析主查询时,仅设置一个自定义查询变量不会导致主查询成功,因此它默认设置主页博客帖子查询。

要解决这个问题,请直接在重写规则中设置post类型查询变量,而不需要这些中间步骤-

add_rewrite_rule(\'slp\\/(.*)\', \'index.php?speaker=$matches[1]\', \'top\');
您还需要筛选post_type_link 如果要在API函数输出永久链接时隐藏原始URL。

function wpd_speaker_links( $url, $post ){
    if ( \'speaker\' == get_post_type( $post ) ) {
        return home_url( "/slp/" . $post->post_name . "/"  );
    }
    return $url;
}
add_filter( \'post_type_link\', \'wpd_speaker_links\', 10, 2 );

相关推荐