[WordPress] add_filter()による無限ループ

add_filter()を利用してアクションフックを行う際にsave_postを代表として無限ループにハマることがあるかと思います。

今回、私は下記のようにwp_insert_post_dataの際に無限ループが起こる問題に直面しました。

add_filter('wp_insert_post_data', array($this,'wpInsertPostData'), 99, 2);

無限ループの要因は、wpInsertPostData()のなかにwp_insert_post()関数を利用していたことでした。 wp_insert_post()内では、save_postやwp_insert_postフックだけではなく、 wp_insert_post_dataフックも存在しています。 そのため、無限ループが発生していたので、該当箇所を修正することで無限ループを抜け出すことができました。

代表的なsave_postの無限ループの例と、その解決方法は以下のようになります。

//無限ループ

add_action(‘save_post’, ‘force_update_post’);

function force_update_post() { $args = array(‘post_status’ => ‘publish’); wp_update_post($args); }

//無限ループ解決
add_action('save_post', 'force_update_post');

function force_update_post() {
    remove_action('save_post', 'force_update_post');
    $args = array('post_status' => 'publish');
    wp_update_post($args);
    add_action('save_post', 'force_update_post');
}