web-dev-qa-db-ja.com

プラグインのカスタム投稿タイプのスラッグの再宣言/変更

プラグインの既存のカスタム投稿タイプのスラッグを(単にプラグインを編集することなく)再宣言/変更することは可能ですか?

つまり、Plugin Xがslug/uncookedtoast /を使ってカスタム投稿タイプを作成する場合、スラッグを/ bread /に変更するfunctions.php(または同様のもの)にフィルタを追加することは可能ですか?

26
Edbury

はい、これは可能ですが、プラグインがrewrite => array('slug' => 'post_type')パラメータを使用してカスタム投稿タイプを作成している場合、 replace スラッグを使用できるようになる可能性はほとんどありません。

カスタム投稿タイプが作成されるたびに、URL書き換えルールがデータベースに書き込まれます。どのアクションがカスタム投稿タイプの作成をトリガーするか( init actionなど)に応じて、WordPressは変更内容に関係なく書き換えルールをフラッシュし、カスタム投稿タイプのスラッグを復元します。

とは言っても、あなたはカスタム投稿タイプにカスタムスラッグを提供することができます。次の例では、カスタム投稿タイプがmoviesで、/movies/スラグを/films/に変更しようとしていると想定しています。

完全にするために、これはmoviesカスタム投稿タイプを定義するために使用される基本的な関数です。あなたが参照しているプラ​​グインはこのようなことをするべきです:

function movies_register_post_type() {

    register_post_type(
        'movies',
        array(
            'labels' => array(
                'name' => __('Movies'),
                'singular_name' => __('Movie')
            ),
            'public' => true,
            'has_archive' => true,
            'rewrite' => array(
                'slug' => 'movies'
            )
        )
    );

} // end example_register_post_type
add_action('init', 'movies_register_post_type');

既存の投稿タイプに基づいて独自のカスタムルールを提供することで、オプションテーブルを変更できます。

基本的に、これを行います。

  • 既存の一連のルールを取り、独自のカスタムスラッグを使って独自のルールを作成します。
  • カスタム投稿タイプのスラッグよりも新しいルールの優先順位を高くする

これを行う方法は次のとおりです。

function add_custom_rewrite_rule() {

    // First, try to load up the rewrite rules. We do this just in case
    // the default permalink structure is being used.
    if( ($current_rules = get_option('rewrite_rules')) ) {

        // Next, iterate through each custom rule adding a new rule
        // that replaces 'movies' with 'films' and give it a higher
        // priority than the existing rule.
        foreach($current_rules as $key => $val) {
            if(strpos($key, 'movies') !== false) {
                add_rewrite_rule(str_ireplace('movies', 'films', $key), $val, 'top');   
            } // end if
        } // end foreach

    } // end if/else

    // ...and we flush the rules
    flush_rewrite_rules();

} // end add_custom_rewrite_rule
add_action('init', 'add_custom_rewrite_rule');

これで、ムービーにアクセスする方法が2つあります。

  • /movies/Back-To-The-Future
  • /films/Back-To-The-Future

add_custom_rewrite_ruleinitアクションにフックすることはあまりにも頻繁に起こるので推奨しないことに注意してください。これはほんの一例です。この機能を適用するためのより良い場所はテーマの有効化、プラグインの有効化、おそらくsave_postアクションなどでしょう。あなたがする必要があるものに応じて、あなたはそれを一度だけあるいは数回起動する必要があるかもしれません。

この時点で、カスタム投稿タイプのパーマリンクを更新して '/movies/スラッグを使用することを検討してください。たとえば、/films/に移動すると、すべての映画のリストが表示されますが、タイトルの上にマウスを移動すると、/movies/スラッグがまだ使用されていることがわかります。

さらに一歩先を行くために、/movies/へのすべてのリンクをキャッチしてそれらの/films/対応物にリダイレクトするために301リダイレクトを技術的にインスタンス化することができますが、これはすべてあなたがやろうとしていることによります。

21
Tom

このコードは私の子供のテーマにはうまくいきました。 「プログラム」スラッグを「場所」に変更する必要がありました。

/*
CHANGE SLUGS OF CUSTOM POST TYPES
*/

function change_post_types_slug( $args, $post_type ) {

   /*item post type slug*/   
   if ( 'program' === $post_type ) {
      $args['rewrite']['slug'] = 'place';
   }

   return $args;
}
add_filter( 'register_post_type_args', 'change_post_types_slug', 10, 2 );

/*
CHANGE SLUGS OF TAXONOMIES, slugs used for archive pages
*/

function change_taxonomies_slug( $args, $taxonomy ) {

   /*item category*/
   if ( 'program-category' === $taxonomy ) {
      $args['rewrite']['slug'] = 'locations';
   }

   return $args;
}
add_filter( 'register_taxonomy_args', 'change_taxonomies_slug', 10, 2 );
4
Iggy