De ce funcția wp_update_post() nu actualizează câmpul post_status?

8 oct. 2012, 03:50:23
Vizualizări: 18.7K
Voturi: 6

Folosesc acest cod pentru a insera/actualiza un tip de postare personalizată din front-end. Data este setată dintr-un datepicker jQuery personalizat.

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

Aceasta funcționează când publică postarea pentru prima dată, setând-o corect ca publish sau future, cu data corectă.

Aceasta nu funcționează când editezi aceeași postare, nici de la publish la future și nici invers. Orice altceva este actualizat corect, cu excepția statusului postării/data_viitoare.

ACTUALIZARE 9 Octombrie Încep să cred că aceasta ar putea fi o eroare, așa că am inițiat o discuție pe lista de discuții wp-hackers, despre acest subiect. Există câteva rezultate de testare pe link.


ALTE ÎNCERCĂRI ESUATE:

Am încercat să las deciziile post_status la wp_insert_post() folosind:

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

Și acest lucru setează statusul postării la draft păstrând în același timp datele solicitate.

Am încercat și să apelez wp_transition_post_status() din nou (este apelată o dată în wp_insert_post()):

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

dar nici asta nu a funcționat.

Nu mai am idei. Aveți vreo sugestie?

9
Comentarii

Sunt confuz, când editez un articol și îl setez ca programat, data articolului nu se actualizează?

westondeboer westondeboer
8 oct. 2012 05:03:18

data articolului se actualizează, dar statusul articolului nu. Deci dacă public un articol astăzi, și apoi îl setez la future cu o dată peste trei zile de acum, data se schimbă, dar post_status rămâne publish, în loc să fie future

moraleida moraleida
8 oct. 2012 05:26:57

Ok, ultima informație: dacă elimin post_status înainte de actualizarea articolului, acesta revine la draft și tot apare în panoul de administrare ca programat. Deci funcționează, dar tot nu răspunde de ce nu pot să-l revin la future.

moraleida moraleida
8 oct. 2012 05:33:01

O faci ca utilizator autentificat cu drepturi suficiente? Funcțiile de manipulare a datelor tind să verifice dacă utilizatorul este de fapt autorizat să le execute.

Rarst Rarst
9 oct. 2012 04:03:03

Da, o fac ca administrator de rețea și, de asemenea, ca un rol de utilizator "personalizat".

moraleida moraleida
9 oct. 2012 04:19:53

Hei, Moraleida, ai uitat să închizi cazul și aici ;)

brasofilo brasofilo
27 nov. 2012 06:12:56

Așa este, frate @brasofilo. O voi posta aici în scurt timp. :)

moraleida moraleida
27 nov. 2012 17:33:42

Și dacă îmi permiți o sugestie: curăță întrebarea, astfel încât Întrebarea și Răspunsul să ajungă direct la subiect. Salutări!

brasofilo brasofilo
27 nov. 2012 18:24:37

Am avut o problemă similară și cauza a fost că parametrul post_status avea mai mult de 20 de caractere. https://codex.wordpress.org/Post_Status Sper să te ajute!

adrianthedev adrianthedev
18 mai 2017 20:57:03
Arată celelalte 4 comentarii
Toate răspunsurile la întrebare 6
0
12

Răspunsul nu ar putea fi mai simplu.

După cum a subliniat Otto pe lista wp-hackers, problema a fost că nu am setat post_date_gmt când am folosit wp_update_post().

Codul final arată astfel:

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

        // De asemenea, trebuie să transmitem 'post_date_gmt' pentru ca WordPress să gestioneze corect datele
        $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 );

        // De asemenea, trebuie să transmitem 'post_date_gmt' pentru ca WordPress să gestioneze corect datele
        $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 dec. 2012 15:54:33
1

Am încercat și codul de mai sus folosind wp_update_post(), dar nu funcționează bine cu WordPress 3.9, lasă post_status gol și șterge toate câmpurile personalizate. Prin urmare, am creat o interogare personalizată folosind clasa wpdb. Sper că acest lucru va funcționa pentru toți:

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

Și acest lucru a funcționat bine atât pe localhost, cât și pe hosting.

10 dec. 2014 19:03:43
Comentarii

Bun venit pe [wordpress.se]. Sper că nu te deranjează modificările. Am rezolvat instrucțiunea prepare.

birgire birgire
10 dec. 2014 19:25:58
0

Actualizăm statusul postărilor în mod constant, iată un exemplu de cum le permitem utilizatorilor (în editorul front-end pe care l-am construit) să "pauzeze" anunțurile prin schimbarea lor în stadiul de draft:

if ($action == 'pause') {
        $my_post = array();
        $my_post['ID'] = $aid; // ID-ul anunțului
        $my_post['post_status'] = 'draft'; // Schimbă statusul în draft
        wp_update_post($my_post); // Actualizează postarea
        $action_msg = __('Anunțul a fost pus pe pauză', 'mytheme'); // Mesaj de confirmare
}
6 dec. 2012 19:31:11
0

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

Aceasta va returna data inițială din PHP din 1970, folosește strtotime pentru a converti stringul în timp

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

31 dec. 2014 12:53:35
0

Trebuie să adaugi "edit_date" => true în array-ul wp_update_post

27 oct. 2019 21:16:00
0

Nu este problema OP-ului, dar ca un punct de referință notabil pentru alții care ajung aici în căutarea unei probleme similare, unde wp_update_post() nu actualizează post_status ...

După cum a menționat @adrianthedev mai sus într-un comentariu la OP, rețineți că lungimea maximă a unui status personalizat al postării este de 20 de caractere.

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

Când se depășesc 20 de caractere, puteți înregistra statusul personalizat al postării folosind register_post_status(), dar în prezent nu puteți seta o postare să îl folosească cu wp_update_post(), cel puțin începând cu WordPress v5.5.1

7 sept. 2020 22:18:09