WordPress 4.2以前
同じスラッグを持つ異なるタクソノミーの用語は、単一の用語IDを共有していました。たとえば、スラッグ「news」を持つタグとカテゴリは同じ用語IDを持っていました。
WordPress 4.2以降
4.2以降、これらの共有用語の1つが更新されると、それは分割されます:更新された用語には新しい用語IDが割り当てられます。
あなたにとっての意味は?
ほとんどの状況において、この更新はシームレスで問題ありませんでした。しかし、オプション、投稿メタ、ユーザーメタ、または他の場所に用語IDを保存するいくつかのプラグインやテーマは影響を受けた可能性があります。
分割の処理
WordPress 4.2には、プラグインやテーマの作者が移行を支援するための2つの異なるツールが含まれています。
split_shared_termフック
共有用語に新しい用語IDが割り当てられると、新しい split_shared_term
アクションが発火します。
プラグインやテーマの作者がこのフックを活用して、保存された用語IDが更新されることを保証する方法のいくつかの例を示します。
オプションに保存された用語ID
あなたのプラグインが featured_tags
というオプションを保存していて、それがホームページのフィーチャード投稿セクションのクエリパラメータとして機能する用語IDの配列([4, 6, 10]
)を含んでいるとしましょう。
この例では、split_shared_term
アクションにフックし、更新された用語IDが配列に含まれているかどうかを確認し、必要に応じて更新します。
/**
* Update featured_tags option when a shared term gets split.
*
* @param int $term_id ID of the formerly shared term.
* @param int $new_term_id ID of the new term created for the $term_taxonomy_id.
* @param int $term_taxonomy_id ID for the term_taxonomy row affected by the split.
* @param string $taxonomy Taxonomy for the split term.
*/
function wporg_featured_tags_split( int $term_id, int $new_term_id, int $term_taxonomy_id, string $taxonomy ): void {
// we only care about tags, so we'll first verify that the taxonomy is post_tag.
if ( 'post_tag' === $taxonomy ) {
// get the currently featured tags.
$featured_tags = get_option( 'featured_tags' );
// if the updated term is in the array, note the array key.
$found_term = array_search( $term_id, $featured_tags, true );
if ( false !== $found_term ) {
// the updated term is a featured tag! replace it in the array, save the new array.
$featured_tags[ $found_term ] = $new_term_id;
update_option( 'featured_tags', $featured_tags );
}
}
}
add_action( 'split_shared_term', 'wporg_featured_tags_split', 10, 4 );
投稿メタに保存された用語ID
あなたのプラグインが特定のページに関連する投稿を表示するために、ページの投稿メタに用語IDを保存しているとしましょう。
この場合、get_posts()
関数を使用して、meta_key
を持つページを取得し、分割された用語IDに一致する meta_value
を更新する必要があります。
/**
* Update related posts term ID for pages
*
* @param int $term_id ID of the formerly shared term.
* @param int $new_term_id ID of the new term created for the $term_taxonomy_id.
* @param int $term_taxonomy_id ID for the term_taxonomy row affected by the split.
* @param string $taxonomy Taxonomy for the split term.
*/
function wporg_page_related_posts_split( int $term_id, int $new_term_id, int $term_taxonomy_id, string $taxonomy ): void {
// find all the pages where meta_value matches the old term ID.
$page_ids = get_posts(
array(
'post_type' => 'page',
'fields' => 'ids',
'meta_key' => 'meta_key',
'meta_value' => $term_id,
)
);
// if such pages exist, update the term ID for each page.
if ( $page_ids ) {
foreach ( $page_ids as $id ) {
update_post_meta( $id, 'meta_key', $new_term_id, $term_id );
}
}
}
add_action( 'split_shared_term', 'wporg_page_related_posts_split', 10, 4 );
wp_get_split_term関数
split_shared_term
フックを使用することは、用語IDの変更を処理するための推奨方法です。
ただし、用語が分割される際に、あなたのプラグインが split_shared_term
アクションにフックする機会がない場合もあります。
WordPress 4.2は、分割されたタクソノミー用語に関する情報を保存し、開発者がこの情報を取得するのを助けるために wp_get_split_term()
ユーティリティ関数を提供します。
上記のケースを考えてみてください。あなたのプラグインが featured_tags
という名前のオプションに用語IDを保存している場合、これらのタグIDが分割されていないことを確認するために(おそらくプラグインの更新時に実行される)、これらのタグIDを検証する関数を構築したいかもしれません:
/**
* Retrieve information about split terms and udpates the featured_tags option with the new term IDs.
*
* @return void
*/
function wporg_featured_tags_check_split() {
$featured_tag_ids = get_option( 'featured_tags', array() );
// check to see whether any IDs correspond to post_tag terms that have been split.
foreach ( $featured_tag_ids as $index => $featured_tag_id ) {
$new_term_id = wp_get_split_term( $featured_tag_id, 'post_tag' );
if ( $new_term_id ) {
$featured_tag_ids[ $index ] = $new_term_id;
}
}
// save
update_option( 'featured_tags', $featured_tag_ids );
}
wp_get_split_term()
は2つのパラメータ、$old_term_id
と $taxonomy
を取り、整数を返します。
古い用語IDに関連するすべての分割された用語のリストを取得する必要がある場合は、タクソノミーに関係なく wp_get_split_terms()
を使用してください。