保存時に用語のdescription
フィールドにコンテンツを挿入しようとしています。
// insert stuff into description field of taxonomy
function insert_taxonomy_content( $term_id, $tt_id, $taxonomy ){
// only insert content on certain taxonomies
if ( $taxonomy === 'some_custom_taxonomy' ){
// unhook this function so it doesn't loop infinitely
remove_action('edit_term', 'insert_taxonomy_content');
$content = "Some Content";
$update_args = array(
'description' => $content,
);
// update the post, which calls save_post again
wp_update_term( $term_id, $taxonomy, $update_args );
// re-hook this function
add_action('edit_term', 'insert_taxonomy_content');
}
}
add_action('edit_term', 'insert_taxonomy_content', 10, 3);
コンテンツの追加は機能しますが、今はもう既存の用語のタイトルを変更することはできません。私はまた新しい用語を追加することはできません。
これは正しい方向を示していると思います。 https://wordpress.stackexchange.com/a/183852/10595
渡された配列は、すでにDBにあるデータとマージされます。
では、Name/Slugフィールドに入力した新しいタイトルやスラッグをwp_update_term
に渡すにはどうすればよいでしょうか。
私も cjbjの提案 に従ってこれを試してみました:
// insert stuff into description field of taxonomy
function insert_taxonomy_content( $term_id, $taxonomy ){
// only insert content on certain taxonomies
if ( $taxonomy === 'some_custom_taxonomy' ){
// unhook this function so it doesn't loop infinitely
remove_action('edit_terms', 'insert_taxonomy_content');
$content = "Some Content";
$update_args = array(
'description' => $content,
);
// update the post, which calls save_post again
wp_update_term( $term_id, $taxonomy, $update_args );
// re-hook this function
add_action('edit_terms', 'insert_taxonomy_content');
}
}
add_action('edit_terms', 'insert_taxonomy_content', 10, 2);
これで私はタイトルとスラッグを再び編集することができますが、今度はdescription
は更新されません。
だから、cjbjのおかげで私はついに正しい答えを見つけました! edited_term
の代わりに edit_term
を使う必要がありました。微妙な違いです。 edited_term
は用語が保存された後に起動します。
// insert stuff into description field of taxonomy
function insert_taxonomy_content( $term_id, $tt_id, $taxonomy ){
// only insert content on certain taxonomies
if ( $taxonomy === 'some_custom_taxonomy' ){
// unhook this function so it doesn't loop infinitely
remove_action('edited_term', 'insert_taxonomy_content');
$content = "Some Content";
$update_args = array(
'description' => $content,
);
// update the post, which calls save_post again
wp_update_term( $term_id, $taxonomy, $update_args );
// re-hook this function
add_action('edited_term', 'insert_taxonomy_content');
}
}
add_action('edited_term', 'insert_taxonomy_content', 10, 3);
edit_term
フックは、「after用語が更新された後、用語キャッシュが消去される前に」起動します。そのため、用語を更新するたびに、その用語のみを更新する関数を起動しますが、その説明のみを実行します。私はこれをテストしていませんが、このプロセスのどこかでWPが最初の更新を失い、2番目の更新のみが重要であると考えることができます。
とにかく、 edit_terms
フックを試してみることをお勧めします。このフックは、用語が更新される前にを起動します。そのようにして、更新は通常の更新プロセスを中断しません。
更新
これはちょっとした推測ゲームになりますが、 wp_update_term
にはさらにいくつかのフックがあります:edited_terms
、edit_term_taxonomy
、edited_term_taxonomy
。
ただし、wp_update_term
の途中でwp_update_term
を呼び出しているという点は変わりません。その関数は、グローバル変数$wpdb
を操作します。したがって、データベースは最初に外部呼び出しの最初の部分によって変更され、次に内部呼び出し(関数)によって変更され、次に外部呼び出しの2番目の部分によって再び変更されます。
おそらく、より良いアクションコースは、関数でwp_update_terms
への呼び出しを終了することです。代わりに、$wpdb->update
を使用してすぐに説明を更新して、フック関数内でデータベースの他の操作が行われないようにすることができます。これをテストすることはできませんでしたが、wp_update_terms
が説明を処理する方法をトレースすると、次のようになります。
$description = "Some Content";
$wpdb->update( $wpdb->term_taxonomy, compact( 'description' ));