自定义POST类型-当使用HAS_ARCHIVE=>TRUE时,在固定链接结构中使用POST_ID

时间:2012-03-02 作者:Scott

我最近问了这个问题Custom post types - Use post_id in permalink structure 解决了这个问题\'has_archive\' => true 给出的解决方案不再有效。让我解释一下:

我追求的是这个结构:

  • archive-events.php => /新闻/事件single-events.php => /新闻/事件/%post\\u id%/%postname%
获取post_id 在一次事件中,我不得不添加permalink%post_id% 至CPT段塞,但启用时has_archive => true 归档页面成为slug;在这种情况下/news/events/%post_id%/ 这是无效的。

所以我的问题是:

使用has\\u archive=>true时,如何在permalink结构中拥有post\\u id

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

要获得所需内容,必须添加自定义重写规则并过滤永久链接结构。以下代码同时执行以下操作:

<?php # -*- coding: utf-8 -*-
/**
 * Plugin Name: Event Permalinks
 */
// Not a WordPress context? Stop.
! defined( \'ABSPATH\' ) and exit;

// Wait until all needed functions are loaded.
add_action( \'init\', array ( \'Bradys_Events\', \'init\' ) );

class Bradys_Events
{
    /**
     * Creates a new instance.
     * 
     * @wp-hook init
     * @see    __construct()
     * @return void
     */
    public static function init()
    {
        new self;
    }

    /**
     * Constructor
     */
    public function __construct()
    {
        $args = array(
            \'label\' => \'events\',
            \'public\' => true,
            \'hierarchical\' => false,
            \'has_archive\' => true,
            \'rewrite\' => array(
                \'with_front\' => false,
                \'slug\' => "news/events"
            ),
            \'supports\' => array( \'title\', \'editor\', \'thumbnail\' )
        );
        register_post_type("events", $args);

        // Prevent WordPress from sending a 404 for our new perma structure.
        add_rewrite_rule(
        \'^news/events/(\\d+)/[^/]+/?$\',
        \'index.php?post_type=events&p=$matches[1]\',
        \'top\'
        );

        // Inject our custom structure.
        add_filter( \'post_type_link\', array ( $this, \'fix_permalink\' ), 1, 2 );
    }

    /**
     * Filter permalink construction.
     * 
     * @wp-hook post_type_link
     * @param  string $post_link default link.
     * @param  int    $id Post ID
     * @return string
     */
    public function fix_permalink( $post_link, $id = 0 )
    {
        $post = &get_post($id);
        if ( is_wp_error($post) || $post->post_type != \'events\' )
        {
            return $post_link;
        }
        // preview
        empty ( $post->slug )
            and $post->slug = sanitize_title_with_dashes( $post->post_title );

        return home_url(
            user_trailingslashit( "news/events/$post->ID/$post->slug" )
        );
    }
}
访问wp-admin/options-permalink.php 一次让WordPress更新其重写规则。

结束

相关推荐

Calling Permalinks With PHP

我正在开发一个支持WordPress帖子格式的主题。因此,我使用了一个大if语句,可以在下面找到。我想将我的帖子标题链接到帖子,同时将我的主题保持为XHTML有效</我想在if语句中调用图像(带类),同时将我的主题保持为XHTML有效</如果有人能在下面的代码中添加适当的代码,我将不胜感激_if ( has_post_format( \'video\' )) { echo the_title(); echo the