web-dev-qa-db-ja.com

保存時にwp_update_termを使用したときにNameまたはSlug of termの編集を保存する方法

保存時に用語の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は更新されません。

1
Florian

だから、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);
2
Florian

edit_term フックは、「after用語が更新された後、用語キャッシュが消去される前に」起動します。そのため、用語を更新するたびに、その用語のみを更新する関数を起動しますが、その説明のみを実行します。私はこれをテストしていませんが、このプロセスのどこかでWPが最初の更新を失い、2番目の更新のみが重要であると考えることができます。

とにかく、 edit_terms フックを試してみることをお勧めします。このフックは、用語が更新される前にを起動します。そのようにして、更新は通常の更新プロセスを中断しません。

更新

これはちょっとした推測ゲームになりますが、 wp_update_term にはさらにいくつかのフックがあります:edited_termsedit_term_taxonomyedited_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' ));
1
cjbj