注:この質問は 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カテゴリを作成するためのフックを見つけることができません)。
カスタム分類法や投稿タイプが機能するわけではありません
これはあなたがすることです:
init
フックで、register_custom_taxonomy
またはregister_post_type
を呼び出します。register_custom_taxonomy
またはregister_post_type
に変更したり、コードに新しい呼び出しを追加したりする場合は、[固定リンク]設定ページにアクセスして[保存]をクリックし、固定リンクを再生成してください。したがって、上記の手順に従ってcolour
という名前の新しい分類法を作成した場合、パーマリンクをフラッシュしてred
またはblue
の用語を作成する必要はありません。 shape
という名前のまったく新しい分類法を作成した場合、パーマリンクをフラッシュしますが、一度だけです。これは、フロントエンドのシェイプ用語にアクセスしたときに404を取得できないようにするためです。カスタム投稿タイプについても同様です。
flush_rewrite_rules
は非常に高価な関数であることを覚えておいてください、そしてあなたはそれを呼び出す必要はないはずです。呼び出される可能性がある場合の例としては、最初にインストールした後のプラグインアクティベーションフック、またはWP CLIコマンドがあります。
書き換えルールをフラッシュするには、register_activation_hook
を使用します。これはあなたのプラグインがアクティブ化されたときに呼び出されます(そしてそれがアクティブ化されたときだけで、すべてのページロードではありません)。
https://codex.wordpress.org/Function_Reference/register_activation_hook
すべての用語の作成をフラッシュすることは不要であり、損害を与えます
after_theme_switch
フックを使用して書き換えルールをフラッシュすることはできますが、投稿タイプと分類法をテーマに登録することはお勧めできません。データの移植性に問題があります。ユーザーがテーマを変更すると、データが失われます。
テーマはサイトの外観を決定し、機能性、特にデータはプラグインで定義されるべきです。
さて、私が思いついた、とても簡単な解決策。以下のコードをfunction.php内の私のインクルードに入れるだけです。
add_action('wp_update_nav_menu_item', function ()
{
flush_rewrite_rules(true);
}, 10, 2);
これはナビゲーションメニューの更新機能にフックするだけなので、管理者がメニューを更新するたびに起動します。
フラッシュ書き換えは「高価な」関数であることを私は知っていますが、ナビゲーションメニューが更新されたときにだけ呼び出されるでしょう。