save_post 콜백에서 무한 루프를 피하는 방법


12

문제를 해결하기 위해이 사이트를 많이 사용했지만 이번에는 문제를 찾아서 해결하지 못했습니다.

wp_update_post호출 된 함수 내부를 사용할 때 무한 루프가 발생 합니다 save_post. 나는 이것이 일반적인 문제라는 것을 알고 있지만 그것을 피하는 방법을 알 수 없습니다.

내 게시물의 순서를 저장하고 싶습니다 (포스트 유형 '섹션'). 그래서 정렬 가능한 html 요소가 포함 된 사용자 정의 메타 상자를 만들었습니다. 각 요소에는 name = 'sectionorder []'인 숨겨진 입력 태그가 있습니다. 따라서 표준 WordPress '업데이트'버튼을 클릭하면 게시물의 모든 ID가 포함 된 배열이 POST를 통해 전송됩니다. 배열을 검색하고 순서를 저장하려는 코드는 다음과 같습니다.

    // Update section sort order
$sectionorder = $_POST['sectionorder'];
if (isset($sectionorder)) { // Avoid error if there is no sections added yet
    foreach( $sectionorder as $no => $sectionID ) {
        $post_update = array();
        $post_update['ID'] = $sectionID;
        $post_update['menu_order'] = $no;
        wp_update_post( $post_update );
    }
}

그러나 문제는 무한 루프를 시작한다는 것입니다. 어떻게 피할 수 있습니까? 어쩌면 내가 완전히 다른 방식으로 그것을 할 수 있습니까?

도와주세요!

답변:


26

save_post후크 에서 콜백을 제거하고 게시물을 업데이트 한 다음 호출을 다시 후크에 다시 추가 할 수 있습니다. 코덱스는 예를 보여줍니다 .

add_action('save_post', 'wpse51363_save_post');

function wpse51363_save_post($post_id) {

    //Check it's not an auto save routine
     if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) 
          return;

    //Perform permission checks! For example:
    if ( !current_user_can('edit_post', $post_id) ) 
          return;

    //Check your nonce!

    //If calling wp_update_post, unhook this function so it doesn't loop infinitely
    remove_action('save_post', 'wpse51363_save_post');

    // call wp_update_post update, which calls save_post again. E.g:
    wp_update_post(array('ID' => $post_id, 'post_status' => 'private'));

    // re-hook this function
    add_action('save_post', 'wpse51363_save_post');
}

와. 빠른 답변 감사합니다. 매력처럼 작동합니다! 내가 왜 그 코드 예제를 보지 못했는지 모르겠다.
elgehelge

@ Stephen, 나는 또한 update_post_meta연결을 save_post끊고 다시 연결 해야하는 기능에 사용 update_post_meta합니까?
Anagio

아니요, update_post_meta(일반적으로) save_post트리거 되지 않습니다 .
스티븐 해리스

한 시간을 낭비한 후 이것을 발견하고 더 많은 시간을 절약했습니다. 감사합니다.
만주 마하라

13

나는 스티븐스가 훌륭하고 정확하더라도 답변을 추가 할 평판을 얻지 못했습니다. 작업의 우선 순위를 설정하려는 경우 인스턴스를 처리하지 않습니다.

조치를 추가 할 때 우선 순위를 설정했지만 제거 할 때 우선 순위를 지정하지 않으면 여전히 무한 루프가 발생합니다.

add_action('save_post', 'wpse51363_save_post', 25 );

// 이것을 잘못 처리하는 방법-무한 루프로 이어짐

remove_action('save_post', 'wpse51363_save_post');
wp_update_post(array('ID' => $post_id, 'post_status' => 'private'));
add_action('save_post', 'wpse51363_save_post');

// 이것을 처리하는 올바른 방법-한 번만 실행

remove_action('save_post', 'wpse51363_save_post', 25 );
wp_update_post(array('ID' => $post_id, 'post_status' => 'private'));
add_action('save_post', 'wpse51363_save_post', 25 );

1
와우 고마워! 나는 추가 할 때조차도 왜 여전히 무한 루프를 얻는 지 알아 내려고 노력했습니다 remove_action/add_action.
Banjer

1
WordPress Codex :: 플러그인 API / 액션 참조 / 저장 포스트 :: 무한 루프 피하기 이를 보여줍니다. WordPress Codex 를 보면 :: 기능 참조 / 제거 동작 :: 사용법 "기능의 우선 순위 (기능이 처음에 연결되었을 때 정의 된대로)" 지정하지 않으면 기본 우선 순위 (10)가 사용됩니다. A / K / A-조치를 실제로 제거하려면 조치가 추가 된 시점과 동일한 SAME 우선 순위를 지정해야합니다.
Michael Ecklund

이것은 내가 찾은 응답입니다. 감사합니다 :)
manuman94
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.