Cómo evitar un bucle infinito en la devolución de llamada save_post

9

He estado usando mucho este sitio para resolver mis problemas, pero esta vez no logré encontrar y responder a mi problema.

Obtengo un bucle infinito cuando uso wp_update_post dentro de una función que se llama en save_post . Sé que este es un problema común, pero no puedo descubrir cómo evitarlo.

Quiero guardar el orden de mis publicaciones (que es de la 'sección' posterior al tipo). Así que he hecho una meta caja personalizada que contiene algunos elementos html. En cada elemento hay una etiqueta de entrada oculta con el nombre = 'sectionorder []'. Entonces, cuando hago clic en el botón estándar de "Actualización" de WordPress, una matriz que contiene todas las ID de las publicaciones (en orden) se envía a través de POST. Así que aquí está el código donde recupero la matriz y quiere guardar el pedido:

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

Pero el problema es que comienza un bucle infinito. ¿Cómo evito eso? Tal vez pueda hacerlo de una manera completamente diferente?

¡Aprecie su ayuda!

    
pregunta elgehelge 07.05.2012 - 12:21

2 respuestas

22

Puede eliminar la devolución de llamada del enlace save_post , actualizar la publicación y volver a agregar la llamada al enlace. El Codex da un ejemplo .

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');
}
    
respondido por el Stephen Harris 07.05.2012 - 12:43
11

Todavía no tengo la reputación para comentar, así que estoy agregando una respuesta a pesar de que la de Stephen es excelente y correcta. Simplemente no controla las instancias en las que desea establecer la prioridad de la acción.

Si establece la prioridad al agregar la acción pero no especifica la prioridad cuando la elimina, seguirá obteniendo un bucle infinito.

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

// La manera INCORRECTA de manejar esto - conduce a un bucle infinito

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

// La forma CORRECTA de manejar esto: se ejecuta solo una vez

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 );
    
respondido por el Charles Jaimet 20.06.2014 - 20:05

Lea otras preguntas en las etiquetas