Cách tránh vòng lặp vô hạn trong cuộc gọi lại save_post


12

Tôi đã sử dụng trang này rất nhiều để giải quyết vấn đề của mình, nhưng lần này tôi đã không thành công trong việc tìm kiếm và trả lời cho vấn đề của mình.

Tôi nhận được và vòng lặp vô hạn khi sử dụng wp_update_postbên trong một hàm được gọi save_post. Tôi biết rằng đây là một vấn đề phổ biến, nhưng tôi không thể tìm ra cách tránh nó.

Tôi muốn lưu thứ tự các bài đăng của mình (thuộc loại 'phần'). Vì vậy, tôi đã tạo một hộp meta tùy chỉnh có chứa một số phần tử html có thể sắp xếp. Trong mỗi phần tử có một thẻ đầu vào ẩn với name = 'partorder []'. Vì vậy, khi tôi nhấp vào tiêu chuẩn 'Cập nhật' của WordPress, một mảng chứa tất cả ID của các bài đăng (theo thứ tự) sẽ được gửi qua POST. Vì vậy, đây là mã nơi tôi lấy mảng và muốn lưu thứ tự:

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

Nhưng vấn đề là nó bắt đầu một vòng lặp vô hạn. Làm thế nào để tôi tránh điều đó? Có lẽ tôi có thể làm điều đó theo một cách hoàn toàn khác?

Đánh giá cao sự giúp đỡ của bạn!

Câu trả lời:


26

Bạn có thể xóa cuộc gọi lại khỏi save_posthook, cập nhật bài đăng và sau đó thêm lại cuộc gọi trở lại hook. Các Codex đưa ra một ví dụ .

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

Ồ Cảm ơn đã trả lời nhanh chóng. Hoạt động như một lá bùa! Không biết tại sao tôi không thấy ví dụ mã đó ..
elgehelge

@Stephen, tôi sử dụng update_post_metatrong một chức năng được nối để save_posttôi cũng nên mở khóa và thử lại sau update_post_meta?
Anagio

Không, update_post_metasẽ không (nói chung) gây ra save_postđược kích hoạt.
Stephen Harris

Sau khi lãng phí một giờ tìm thấy điều này và điều này cũng tiết kiệm nhiều giờ hơn, cảm ơn bạn.
Manchumahara

13

Tôi không có tiếng tăm gì để bình luận vì vậy tôi đang thêm một câu trả lời mặc dù Stephen là tuyệt vời và chính xác. Nó chỉ không xử lý các trường hợp khi bạn muốn đặt mức độ ưu tiên của hành động.

Nếu bạn đặt mức độ ưu tiên khi thêm hành động nhưng không chỉ định mức độ ưu tiên khi bạn xóa nó, bạn vẫn sẽ nhận được một vòng lặp vô hạn.

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

// Cách SAU để xử lý việc này - dẫn đến vòng lặp vô hạn

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

// Cách QUYỀN để xử lý việc này - chỉ thực hiện một lần

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
Ồ cảm ơn nhé! Tôi đã cố gắng tìm ra lý do tại sao tôi vẫn nhận được vòng lặp vô hạn, ngay cả khi thêm remove_action/add_action.
Banjer

1
WordPress Codex :: Plugin API / Tham chiếu hành động / lưu bài đăng :: Tránh các vòng lặp vô hạn Họ chứng minh điều này. Nếu bạn xem WordPress Codex :: Tham chiếu chức năng / loại bỏ hành động :: Cách sử dụng "Mức độ ưu tiên của chức năng (như được xác định khi chức năng ban đầu được nối)." Nếu không được chỉ định, nó sử dụng mức ưu tiên mặc định (10). A / K / A - Bạn phải chỉ định mức độ ưu tiên CÙNG như khi hành động được thêm vào, để HOẠT ĐỘNG loại bỏ hành động.
Michael Ecklund

Đây là phản ứng tôi đang tìm kiếm. Cảm ơn bạn :)
manuman94
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.