web-dev-qa-db-ja.com

カスタム投稿タイプの分類法に新しいカテゴリが追加されたときにパーマリンクを更新する

注:この質問は https://stackoverflow.com/questions/44060613/update-permalinks-when-new-category-added-to-custom-post-type-taxonomy/にもあります。 (しかしそれほど愛されていない)。

私が取り組んでいるWordPressテーマ用のカスタム投稿タイプ(CPT)のコレクションを(独自の分類法とタグと共に)作成しました。この質問の目的のために、私はただ 'プロジェクト' CPTに焦点を合わせます。

新しいプロジェクトカテゴリが追加され、ナビゲーションメニューでリンクされると、パーマリンクが保存されるまで404エラーが表示され、WordPressのルートキャッシュがクリアされます。

これを達成するための最良の方法はflush_rewrite_rules()を使用することであると私は考えていました。

とは言っても - それは言う - ベストプラクティスはプラグインを有効化/無効化するときにこの関数を使用することのみを強く推奨するので、私は軽くそれを採用しない。 https://codex.wordpress.org/Function_Reference/flush_rewrite_rules#Usage

私がやりたいのは、新しいCPTカテゴリが作成されたときに起動するアクションにフックし(投稿または管理画面から)、そのアクションに対してフラッシュ書き換えを実行してWP adminが実行されないようにすることです。パーマリンクの更新を介してWordpressのルートキャッシングを強制することに気を配る必要があります。

私はこれを見て 新しいカテゴリの追加 にフックして考えられる解決策を見つけ、このコードを使用しようとしました:

function custom_created_term( $term_id, $tt_id, $taxonomy )
{
    $project_cpt = 'CPT_PROJECT';  // Edit this to your needs
    $project_tax = 'TAX_PROJECT_CATS';  // Edit this to your needs

    if( DOING_AJAX && $project_tax === $taxonomy )
    {
        // Try to get the post type from the post id in the referred page url
        // Example: /wp-admin/post.php?post=2122&action=edit&message=1

        parse_str( parse_url( wp_get_referer(), PHP_URL_QUERY ) , $params );

        if( isset( $params['post'] ) )
        {
            $post_id = intval( $params['post'] );
            if( $post_id > 0 && $project_cpt === get_post_type( $post_id ) )
            {
                flush_rewrite_rules(true);

            }
        }
    }
}

しかし、それは私のために実際にうまくいっていません。ここで正しいツールを使っているのか、それとも間違ったことをしているのかわかりません。解決策をかなり模索してきましたが、私はここで私の問題に対する良い解決策を思い付いていません(新しいCPTカテゴリを作成するためのフックを見つけることができません)。

1
Ryan Coolwebs

カスタム分類法や投稿タイプが機能するわけではありません

これはあなたがすることです:

  • initフックで、register_custom_taxonomyまたはregister_post_typeを呼び出します。
  • 呼び出しをregister_custom_taxonomyまたはregister_post_typeに変更したり、コードに新しい呼び出しを追加したりする場合は、[固定リンク]設定ページにアクセスして[保存]をクリックし、固定リンクを再生成してください。
  • あなたはやった

したがって、上記の手順に従ってcolourという名前の新しい分類法を作成した場合、パーマリンクをフラッシュしてredまたはblueの用語を作成する必要はありません。 shapeという名前のまったく新しい分類法を作成した場合、パーマリンクをフラッシュしますが、一度だけです。これは、フロントエンドのシェイプ用語にアクセスしたときに404を取得できないようにするためです。カスタム投稿タイプについても同様です。

flush_rewrite_rulesは非常に高価な関数であることを覚えておいてください、そしてあなたはそれを呼び出す必要はないはずです。呼び出される可能性がある場合の例としては、最初にインストールした後のプラグインアクティベーションフック、またはWP CLIコマンドがあります。

404のを避ける方法

書き換えルールをフラッシュするには、register_activation_hookを使用します。これはあなたのプラグインがアクティブ化されたときに呼び出されます(そしてそれがアクティブ化されたときだけで、すべてのページロードではありません)。

https://codex.wordpress.org/Function_Reference/register_activation_hook

すべての用語の作成をフラッシュすることは不要であり、損害を与えます

CPT/CTをテーマに登録した場合はどうなりますか?

after_theme_switchフックを使用して書き換えルールをフラッシュすることはできますが、投稿タイプと分類法をテーマに登録することはお勧めできません。データの移植性に問題があります。ユーザーがテーマを変更すると、データが失われます。

テーマはサイトの外観を決定し、機能性、特にデータはプラグインで定義されるべきです。

1
Tom J Nowell

さて、私が思いついた、とても簡単な解決策。以下のコードをfunction.php内の私のインクルードに入れるだけです。

add_action('wp_update_nav_menu_item', function ()
{
    flush_rewrite_rules(true);
}, 10, 2);

これはナビゲーションメニューの更新機能にフックするだけなので、管理者がメニューを更新するたびに起動します。

フラッシュ書き換えは「高価な」関数であることを私は知っていますが、ナビゲーションメニューが更新されたときにだけ呼び出されるでしょう。

0
Ryan Coolwebs