使用‘POST_LINK’过滤器更新固定链接结构会导致帖子出现404错误

时间:2017-10-03 作者:Chance Strickland

我正在尝试修改默认帖子类型的permalink结构post 包括自定义分类术语。以下是我的函数和过滤器:

/**
 * Add media type slug to URL structure for posts
 */
add_filter( \'post_link\', \'xx_filter_post_type_link\', 10, 2 );

function xx_filter_post_type_link( $link, $post ) {

  if ( false === strpos( $link, \'%media_type%\') )
    return $link;

  $terms = wp_get_post_terms( $post->ID, \'media-type\');
  // set media type; if none is found, provide a default value.
  if ( 0 < count($terms) ) {
    // Get first term in array
    $first_term = $terms[0]->term_id;
    // Create a string to represent hierarchy of terms
    $media_type = get_taxonomy_parents( $first_term, \'media-type\', false, \'/\', true );
    // Remove trailing slash
    $media_type = trim( $media_type, \'/\' );
  } else {
    $media_type = \'articles\';
  }
  $media_type = urlencode($media_type);
  $media_type = str_replace( \'%2F\', \'/\' , $media_type );
  $link = str_replace( \'%media_type%\', $media_type , $link );

  return $link;
}
在中Settings > Permalinks 我正在使用的自定义结构/insights/%media_type%/%postname%/.

重置永久链接后,帖子URL的格式正确,但当我导航到该链接时,会看到404页。悲伤的熊猫。

我是如何成为一个哑巴的,我应该如何变得更聪明才能做到这一点?

EDIT: 读了一点法典后,我意识到我忘了添加重写规则。也就是说,我仍然缺少一些东西。我稍微更新了上面的函数hierarchicaltruerewrite 属性。现在,我的帖子工作正常,除非它们被分配给层次结构中的多个分类术语(例如,xx.com/insights/parent/post 有效,但xx.com/insights/parent/child/post还是给了我一个404)。我的正则表达式技能很弱,所以想知道我是否遗漏了一些可以解释层次结构的东西。

add_action( \'init\', \'xx_media_type_rewrite_tag\', 10, 0 );

function xx_media_type_rewrite_tag() {
  add_rewrite_tag( \'%media_type%\', \'([^&]+)\', \'media-type=\' );
  add_rewrite_rule( \'^insights/([^/]*)/([^/]*)/?\',\'index.php?media_type=$matches[1]&name=$matches[2]\',\'top\' );
}

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

我找到了一个解决方案,虽然我不相信这是最简单或最有效的解决方案,但它确实起到了作用。如果有人有一天对此感兴趣,并有了一个更干净的方法,我很乐意重新审视它。现在,以下是有效的方法:

在我的register_taxonomy 函数,将重写设置为:

\'rewrite\'             => array(
  \'slug\'                => \'media-type\',
  \'hierarchical\'        => true,
),
然后,为帖子设置重写规则:

add_action( \'init\', \'xx_media_type_rewrite_tag\', 10, 0 );

function xx_media_type_rewrite_tag() {
  add_rewrite_tag( \'%media_type%\', \'([^&]+)\', \'media-type=\' );
  add_rewrite_rule( \'^insights/([^/]*)/([^/]*)/([^/]*)/?\',\'index.php?media_type=$matches[1]&media_type=$matches[2]&name=$matches[3]\',\'top\' );
  add_rewrite_rule( \'^insights/([^/]*)/([^/]*)/?\',\'index.php?media_type=$matches[1]&name=$matches[2]\',\'top\' );
}
然后,过滤帖子链接(如果我知道自己在做什么,我会想象这部分看起来会更干净):

add_filter( \'post_link\', \'xx_filter_post_type_link\', 10, 2 );

function xx_filter_post_type_link( $link, $post ) {

  if ( false === strpos( $link, \'%media_type%\') )
    return $link;

  $terms = wp_get_post_terms( $post->ID, \'media-type\');

  // set media type; if none is found, provide a default value.
  if ( 0 < count($terms) ) {

    // Get first term in array
    $first_term = $terms[0]->term_id;

    // Create a string to represent hierarchy of terms
    // get_taxonomy_parents() is a custom function that returns a string formatted as `$tax_parent . $separator . $tax_child . $separator` etc.
    $media_type = get_taxonomy_parents( $first_term, \'media-type\', false, \'/\', true );

    // Remove everything after second `/` character (we only want to go two levels deep into the tax hierarchy)
    if ( 2 < substr_count( $media_type, \'/\' ) ) {
      $media_type = substr( $media_type, 0, strpos( $media_type, \'/\', strpos( $media_type, \'/\') + 1 ) );
    }

    // Remove trailing slash
    $media_type = trim( $media_type, \'/\' );

  } else {
    // Set default
    $media_type = \'articles\';
  }
  // Encode for URL usage, but preserve slashes
  $media_type = str_replace( \'%2F\', \'/\' , urlencode($media_type) );

  $link = str_replace( \'%media_type%\', $media_type , $link );

  return $link;
}

结束

相关推荐

自定义搜索表单,POSTS_PER_PAGE值被忽略

我正在尝试构建自定义搜索表单,我希望覆盖网站的默认每页帖子数限制,但我使用的隐藏字段似乎根本不起作用:我有:<input type=\"hidden\" value=\"-1\" name=\"posts_per_page\" /> 。。但当我在搜索结果页面上检查$wp\\u查询时,这似乎被忽略了(我正在进行的搜索匹配29篇帖子,但$wp\\u查询->帖子的计数为10。我使用不同的值进行了多次测试,但都没有用。完整自定义搜索表单如下所示:<form role=\"sear