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


28

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

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


優先度20でinitにフックし、同じ投稿タイプに対してregister_post_typeを再度呼び出すことで、この同じ問題を解決しました。これが将来私に問題を引き起こすかどうか誰もが知っていますか?
ダスティン

回答:


24

はい、これは可能ですが、プラグインがrewrite => array('slug' => 'post_type')パラメーターを使用してカスタム投稿タイプを作成している場合、スラッグを置き換えることができる可能性は低いでしょう。

カスタム投稿タイプが作成されるたびに、URL書き換えルールがデータベースに書き込まれます。どのアクションがカスタム投稿タイプの作成をトリガーするか(initアクションなど)に応じて、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_ruleされるため、initアクションにフックすることはお勧めしません。これは単なる例です。関数を適用するより良い場所は、テーマのアクティブ化、プラグインのアクティブ化、おそらくsave_postアクションなどです。実行する必要に応じて、1回または数回だけ実行する必要があります。

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

さらに一歩進むには、技術的に301リダイレクトをインステートにしてすべてのリンクをキャッチ/movies/し、/films/対応するものにリダイレクトすることができますが、これは何をしようとしているかによって異なります。


美しく働きました!パーマリンクを更新するための正しい方向を教えてもらえますか?
エドベリー

1
テーマに応じて、テンプレートレベルでこれを行うことができます。「the_title()」の呼び出しが表示されたら、それを$ title = get_the_title()に置き換え、$ titleの「/ movies /」を「/ films /」に文字列で置き換えます。
トム

変更したいスラッグが現在の投稿のメタ値によって動的に作成された場合はどうなりますか?私が使用できるようにする必要がある$postadd_custom_rewrite_rule()機能が、それは「非オブジェクトのプロパティを取得しようとすると」言ってWP Adminでエラーを投げています。メタ値を取得するために$ postを取得するにはどうすればよいですか?
リー

6

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

/*
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 );

それは完全に動作し、相対ルールを追加するタグにも使用しました。設定ページ>パーマリンクから保存を実行してパーマリンクを更新する必要があります。ありがとうございました!
ロレンツォ

他の引数も変更するために完全に$args['has_archive'] = false機能します。設定する必要があり、これは機能しました。
単なる開発
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.