web-dev-qa-db-ja.com

カスタム投稿タイプ - has_archive => trueを使うとき、パーマリンク構造でpost_idを使う

私は最近この質問をしました カスタム投稿タイプ - パーマリンク構造でpost_idを使う そして解決しましたが、'has_archive' => trueを有効にしたので与えられた解決策はもはや機能しません。説明させてください:

私はこの構造の後にいます:

  • archive-events.php =>/news/events /
  • single-events.php =>/news/events /%post_id%/%postname%

単一のイベントパーマリンクでpost_idを取得するには、CPTスラッグに%post_id%を追加する必要がありましたが、has_archive => trueを有効にすると、アーカイブページがスラッグになります。この場合、/news/events/%post_id%/になりますが、これは無効です。

だから私の質問:

Has_archive => trueを使ったときにpost_idをパーマリンク構造にするにはどうすればいいですか?

4
Brady

必要なものを取得するには、カスタムの書き換え規則を追加し、パーマリンクの構成をフィルタリングする必要があります。次のコードは両方を行います。

<?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に書き換え規則を更新させてください。

5
fuxia