BLOG

ブログ

  • Web制作

WordPress 投稿タイトルをカスタムフィールドやタクソノミーから自動生成

WordPress 投稿タイトルをカスタムフィールドやタクソノミーから自動生成

カスタムフィールドで構成される記事を扱う時に、タイトルが不要な時ってありますよね。

そんな時にカスタムフィールドの値やカスタムタクソノミーのタームからタイトルを自動生成させる話です。

参考にさせてもらった記事の通りやってみると、記事を更新した時にグルグルが止まらず、ずっと更新されませんでした。

そこでアクションフック”save post”の記事を見てみると

無限ループ回避
wp_update_post() のようにフック save_post を含む関数を呼び出すと、フックした関数が無限ループを引き起こします。これを避けるには、必要な関数を呼ぶ前に自分(関数)をフック解除し、終わってから改めてフックします。

WordPress Codex

こんな記述があったので、18行目と24行目を追加。

これで上手くいきました。

functions.php に下記を追記します。

function rename_post_title($post_id)
{

    global $post;

    $menucat_term      = wp_get_object_terms($post->ID, 'menucat'); //タクソノミーを使う場合はここで指定
    $menucat_term_name = $menucat_term[0]->name; //ターム名

    if ($post->post_type == 'menu') { #投稿タイプの確認

        //タイトルになる文字列を生成
        $title = $menucat_term_name . ' / ' . get_post_meta($post_id, 'info1', true) . ' / ' . get_post_meta($post_id, 'info2', true) . ' / ' . get_post_meta($post_id, 'info3', true);

        //現在のタイトルと異なる場合のみタイトルを更新
        if (get_the_title($post_id) !== $title) {

            // 自分をフック解除して無限ループさせない
            remove_action('save_post', 'rename_post_title');

            //生成したタイトルに書き換え
            wp_update_post(['ID' => $post_id, 'post_title' => $title]);

            // 自分を改めてフックする
            add_action('save_post', 'rename_post_title');
        }
    }
}

add_action('save_post', 'rename_post_title');