¿Por qué wp_update_post() no actualiza el campo post_status?

8 oct 2012, 03:50:23
Vistas: 18.7K
Votos: 6

Estoy usando este código para insertar/actualizar un tipo de publicación personalizado desde el front-end. La fecha se establece desde un selector de fechas personalizado con jQuery.

    if (strtotime($date) < strtotime('tomorrow')) {
            $newpostdata['post_status'] = 'publish';
    } elseif (strtotime($date) > strtotime('today')) {
            $newpostdata['post_status'] = 'future';
            $newpostdata['post_date'] = date('Y-m-d H:i:s', strtotime($date));
    }

    if ('insert' == $operation) {
        $err = wp_insert_post($newpostdata, true);
    } elseif ('edit' == $operation) {
        $newpostdata['ID'] = $post_id;
        $err = wp_update_post($newpostdata);
    }

Esto funciona cuando se publica por primera vez, estableciéndolo correctamente como publish o future, con la fecha correcta.

Esto no funciona al editar la misma publicación, ni de publish a future ni viceversa. Todo lo demás se actualiza correctamente, excepto el estado de la publicación/future_date.

ACTUALIZACIÓN 9 de Octubre Estoy empezando a pensar que esto podría ser un error, así que inicié una conversación en la lista de correo wp-hackers, sobre esto. Hay algunos resultados de pruebas en instalaciones frescas en el enlace.


OTROS INTENTOS FALLIDOS:

He intentado dejar las decisiones de post_status a wp_insert_post() usando:

elseif ('edit' == $operation) {
        $newpostdata['post_status'] = '';
        $newpostdata['ID'] = $post_id;
        $err = wp_update_post($newpostdata);
    }

Y esto establece el estado de la publicación como draft mientras mantiene las fechas solicitadas.

También he intentado llamar a wp_transition_post_status() nuevamente (se llama una vez dentro de wp_insert_post()):

elseif ('edit' == $operation) {
        $newpostdata['ID'] = $post_id;
        $err = wp_update_post($newpostdata);
        wp_transition_post_status($old_status, $status, $post_id);
    }

pero eso tampoco pareció funcionar.

Me estoy quedando sin ideas aquí. ¿Alguna pista?

9
Comentarios

Estoy confundido. Cuando edito la publicación y la configuro como futura, ¿la fecha de la publicación no se actualiza?

westondeboer westondeboer
8 oct 2012 05:03:18

La fecha de la publicación se actualiza, pero el estado de la publicación no. Entonces, si publico una publicación hoy y luego la configuro como future con una fecha dentro de tres días, la fecha cambia, pero el post_status sigue siendo publish en lugar de future.

moraleida moraleida
8 oct 2012 05:26:57

Ok, esto acaba de llegar: si elimino el post_status antes de actualizar la publicación, se revierte a draft y aún aparece en el panel de administración como programada. Así que funciona, pero eso aún no responde por qué no puedo revertirla a future.

moraleida moraleida
8 oct 2012 05:33:01

¿Estás haciendo esto como usuario registrado con capacidades suficientes? Las funciones de manipulación de datos suelen verificar si el usuario realmente tiene permiso para realizarla.

Rarst Rarst
9 oct 2012 04:03:03

Sí, lo estoy haciendo como administrador de red, y también como un rol de usuario "personalizado".

moraleida moraleida
9 oct 2012 04:19:53

Oye, Moraleida, también olvidaste cerrar el caso aquí ;)

brasofilo brasofilo
27 nov 2012 06:12:56

Tienes razón, hermano @brasofilo. Lo publicaré aquí en breve. :)

moraleida moraleida
27 nov 2012 17:33:42

Y si puedo sugerir algo: limpia la pregunta, para que Pregunta y Respuesta vayan directo al grano. ¡Saludos!

brasofilo brasofilo
27 nov 2012 18:24:37

Tuve un problema similar y la causa fue que el parámetro post_status tenía más de 20 caracteres. https://codex.wordpress.org/Post_Status ¡Espero que te ayude!

adrianthedev adrianthedev
18 may 2017 20:57:03
Mostrar los 4 comentarios restantes
Todas las respuestas a la pregunta 6
0
12

La respuesta no podría ser más simple.

Como señaló Otto en la lista de wp-hackers, el problema era que no estaba configurando post_date_gmt al usar wp_update_post().

El código final queda así:

if ( $post_date < strtotime( "tomorrow" ) ) {
        $status = 'publish';    
        $newpostdata['post_status'] = $status;
        $newpostdata['post_date'] = date( 'Y-m-d H:i:s',  $post_date );

        // También pasar 'post_date_gmt' para que WP maneje bien las fechas
        $newpostdata['post_date_gmt'] = gmdate( 'Y-m-d H:i:s', $post_date );

    } elseif ( $post_date > strtotime( 'today' ) ) {
        $status = 'future';    
        $newpostdata['post_status'] = $status;
        $newpostdata['post_date'] = date( 'Y-m-d H:i:s', $post_date );

        // También pasar 'post_date_gmt' para que WP maneje bien las fechas
        $newpostdata['post_date_gmt'] = gmdate( 'Y-m-d H:i:s', $post_date );
    }

    if ('insert' == $operation) {
        $err = wp_insert_post($newpostdata, true);
    } elseif ('edit' == $operation) {
        $newpostdata['ID'] = $post_id;
        $err = wp_update_post($newpostdata);
    }
20 dic 2012 15:54:33
1

También probé el código anterior usando wp_update_post(), pero no funciona bien con WordPress 3.9, deja el post_status vacío y elimina todos los campos personalizados. Por lo tanto, creé una consulta personalizada utilizando la clase wpdb. Espero que esto funcione para todos ustedes:

$wpdb->query( 
    $wpdb->prepare( 
        "UPDATE $wpdb->posts SET post_status = 'draft' WHERE ID = %d", 
        $post_id 
    )
);    

y esto funcionó bien tanto en mi localhost como en el hosting.

10 dic 2014 19:03:43
Comentarios

Bienvenido a [wordpress.se]. Espero que no te importen las modificaciones. Corregí la declaración prepare.

birgire birgire
10 dic 2014 19:25:58
0

Actualizamos el estado de las publicaciones todo el tiempo, aquí hay un ejemplo de cómo permitimos a los usuarios (en el editor de front-end que construimos) "pausar" anuncios cambiándolos a borrador:

if ($action == 'pause') {
        $my_post = array();
        $my_post['ID'] = $aid;
        $my_post['post_status'] = 'draft';
        wp_update_post($my_post);
        $action_msg = __('El anuncio ha sido pausado', 'mytheme');
}
6 dic 2012 19:31:11
0

$newpostdata['post_date'] = date( 'Y-m-d H:i:s', $post_date );

Esto devolverá la fecha inicial de PHP en 1970, usa strtotime para convertir la cadena a tiempo

$newpostdata['post_date'] = date( 'Y-m-d H:i:s', strtotime($post_date) );

31 dic 2014 12:53:35
0

Necesitas agregar "edit_date" => true en el array de wp_update_post

27 oct 2019 21:16:00
0

No es el problema del OP, pero como un punto de referencia notable para otros que lleguen aquí investigando un problema similar donde wp_update_post() no actualiza el post_status...

Como @adrianthedev mencionó anteriormente en un comentario sobre el OP, ten en cuenta que la longitud máxima de un estado de publicación personalizado es de 20 caracteres.

https://developer.wordpress.org/reference/functions/register_post_status/#comment-3927

Cuando se exceden los 20 caracteres, puedes registrar el estado de publicación personalizado usando register_post_status(), pero actualmente no podrás establecer una publicación con ese estado usando wp_update_post(), al menos hasta WordPress v5.5.1

7 sept 2020 22:18:09