##フック
edit_terms(複数形)、edited_term(単数形)の二つのフックを使うことで実現できた。
edit_terms グがDBに保存される前に呼び出される
edited_term 保存された後に呼び出される
カスタマイズはテーマディレクトリ内にfunction.phpファイルを作成して記述する。
wordpress/htdocs/wp-content/themes/テーマ名/function.php
フックを利用するには、WordPressに組み込まれているadd_action関数を利用する。
function.php
// タグが更新される直前: 更新前のタグ情報を変数に保持する
add_action('edit_terms', 'get_tag_edit_before', 10, 2);
function get_tag_edit_before($term_id, $taxonomy){
$tag = get_tag($term_id);
global $cstm_tag_slug;
$cstm_tag_slug->slug = $tag->slug;
}
function.php
// タグが更新された場合: タグに紐づく固定ページを更新する
add_action( "edited_term", 'edit_info_page', 10, 3);
function edit_info_page($term_id, $tt_id, $taxonomy){
global $wpdb;
if($taxonomy != 'post_tag'){ return; }
$tag = get_tag($term_id);
$tag_slug = $tag->slug;
$tag_name = $tag->name;
// 固定ページIDを取得する
global $cstm_tag_slug;
$post_id = $wpdb->get_var( 'SELECT
ID
FROM '.$wpdb->posts.'
WHERE post_type = "page"
AND post_name = "'.CSTM_PREFIX.$cstm_tag_slug->slug.'"'
);
$post = array(
'ID' => $post_id,
'post_title' => CSTM_TITLE . $tag_name,
'post_name' => CSTM_PREFIX . $tag_slug
);
wp_update_post($post);
}
※ WordPressのフックは似たような名前が付けられたフックが多く、
引数の数などが違っても動かなかったりした。
例:edit_terms、edit_term、edited_terms、edited_term
edited_termsは編集保存後に実行されるフックなのかと思ってしまうが、実際は違う。
###おまけ1:タグ追加時にテンプレートを指定して固定ページを作成する
ソースコードは下記。
function.php
// タグが追加された場合: タグに紐づく固定ページを作成する
add_action('create_term', 'create_info_page', 10, 3);
function create_info_page($term_id, $tt_id, $taxonomy){
if($taxonomy != 'post_tag'){ return; }
$tag = get_tag($term_id);
$tag_slug = $tag->slug;
$tag_name = $tag->name;
// タグが追加された場合
// 固定ページを自動作成する
$post = array(
'post_title' => CSTM_TITLE . $tag_name,
'post_content' => '',
'post_status' => 'publish',
'post_type' => 'page',
'post_name' => CSTM_PREFIX . $tag_slug,
'page_template' => CSTM_INFO_TEMPLATE
);
wp_insert_post( $post, true);
}
###おまけ2:WordPressタグ更新処理について詳しく知りたい
ソースコードはこちら
https://core.trac.wordpress.org/browser/tags/4.9.8/src/wp-includes/taxonomy.php