发布归档页面的自定义固定链接结果404

时间:2012-02-23 作者:Luke

我已经为我的博客设置了以下自定义永久链接结构:

/news/%postname%
当我浏览到/news 我期待着archive.php 要提供的模板,不幸的是,我收到了404。

我的重写工作正常,因为我可以查看所有帖子,如/news/my-post-title.

如何使我的“archive.php”在浏览时可用/news, 目前,我必须创建一个虚拟新闻页面,这当然是我不想要的。

任何帮助都将不胜感激。

UPDATE:

我已将我的类别库和标记库永久链接设置如下:

news/categorized
news/tagged
浏览到/news/categorized/test 触发category.php 模板和浏览到/news/tagged/test 把我带到tag.php 样板

我还是没有运气触发archive.php.

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

可以替代init 操作并为存档和重写注册正确的值:

add_action(\'init\', \'my_init\');

function my_init()
{
   $args = objectToArray( get_post_type_object(\'post\') );

   $args[\'has_archive\'] = \'news\';
   $args[\'rewrite\'] = array(
      \'slug\' => \'news\',
      \'with_front\' => FALSE,
   );

   register_post_type(\'post\', $args);
}

function objectToArray( $object )
{
   if( !is_object( $object ) && !is_array( $object ) )
   {
      return $object;
   }

   if( is_object( $object ) )
   {
      $object = get_object_vars( $object );
   }

   return array_map(\'objectToArray\', $object);
}
通过指定has_archive 以及rewrite Post type对象的值可以强制Wordpress执行与自定义Post类型相同的行为。

Wordpress现在应该拿起archive.php 浏览到时的模板/news.

唯一笨拙的是get_post_type_object 返回数组的对象版本register_post_type 作为参数,因此objectToArray 辅助函数。

SO网友:Chintan Oza

如果您想要像/新闻这样的存档页面,需要在像/新闻/最新这样的存档页面和像/新闻/最新/%postname%这样的发布详细信息页面之后使用自定义slug,下面是帮助我的代码。。

将此代码添加到函数。php

add_action( \'init\', \'create_news\' );
function create_news() {
register_post_type( \'news\',
    array(
           \'labels\' => array(
            \'name\' => \'News\',
            \'singular_name\' => \'News\',                
          ), 
          \'taxonomies\' => array( \'category\'),
          \'rewrite\' => array( \'slug\' => \'%latest_tag%\', \'with_front\' => false ),
          \'has_archive\' => \'news\'
        )
    );
    register_taxonomy(
         \'latest_tag\',
         \'news\',
         array(
            \'rewrite\' => array( \'slug\' => \'latest\', \'with_front\' => false ),
          )
      );
}
之后,将下面的代码放入相同的函数中。php。。

function custom_slug_permalinks( $post_link, $post ){
    if ( is_object( $post ) && $post->post_type == \'news\' ){
        $terms = wp_get_object_terms( $post->ID, \'state_tag\' );
        if( $terms ){
           return str_replace( \'%latest_tag%\' , $terms[0]->slug , $post_link );
        }
  }
   return $post_link;
  }
 add_filter( \'post_type_link\', \'custom_slug_permalinks\', 1, 2 );
没有必要将“has\\u archive”添加为true,相反,您可以在那里使用自定义的post slug名称,wordpress将转到archive。php。。在那之后,Do not forget to go settings->permalinks and click on save button :)

SO网友:jbuncle

重新注册帖子类型导致了错误,因此您可以过滤;args“;创建帖子时(而不是重新创建整个帖子类型)。

add_filter(\'register_post_type_args\', function($args, $type) {
    if ($type === \'post\') {

        $args[\'has_archive\'] = \'news\';
        $args[\'rewrite\'] = array(
            \'slug\' => \'news\',
            \'with_front\' => FALSE,
        );
    }
    return $args;
}, 10, 2);
同样,您仍然需要进行设置->;永久链接并单击保存。

您可以在此处看到正在运行的筛选器:https://github.com/WordPress/WordPress/blob/fcd890e54625d165c853825cdd4a44d17afd2acd/wp-includes/class-wp-post-type.php#L386

钩子文档位于此处:https://developer.wordpress.org/reference/hooks/register_post_type_args/

SO网友:na86

改变

register_post_type(\'post\', $args);

register_post_type(\'news\', $args);
它工作得非常好!

结束

相关推荐

为什么GET_POSTS会忽略带有两位数ID的帖子?

我使用此代码列出当前页面的子页面,并使用类似代码获得所有祖先的子页面,以便在侧栏上下文层次导航菜单中使用:$pageset = get_posts(\'numberposts=0&post_type=page&post_parent=\'.$wp_query->post->ID); 出于某种原因,两次迭代都忽略了具有两位数帖子id的帖子。其他一切都显示得很好。我错过什么了吗?我是否有不正确的设置?我在这里撞到头了。。。