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'); }