web-dev-qa-db-fra.com

Date_date => future - erreur d'horaire manquée

Je travaille sur un planificateur d'événements personnalisé pour mon site Web qui permet aux utilisateurs de facilement entrer et de définir l'article à poster à l'avenir. Si je remplace la fonctionnalité normale de Wordpress, c'est parce que je souhaitais faciliter le choix de la date, car les sermons ne devraient être publiés que le dimanche. J'ai donc un calendrier déroulant personnalisé qui vous permet uniquement de sélectionner le dimanche du mois.

Quoi qu'il en soit, mon problème est que tous mes messages donnent une erreur de "Calendrier manqué" dans le panneau d'administration. Je peux contourner ce problème en utilisant "post_status" => "future" pour afficher les messages sur la page, mais c’est un peu "hacky" ...

Pourquoi ce code me donne-t-il l'erreur "Missed Schedule"?

function cfc_reset_sermondate( $data ) {

if($data['post_type'] == 'sermon_post') {
    if($_POST['cfc_sermon_date']) {
        $date = $_POST['cfc_sermon_date'];
       // $date = DateTime::createFromFormat('D - M j, Y', $date);
       // $date = $date->format('Y-m-d');
        $date = createFromFormat($date);


        $postDate = strtotime($date);

        $data['post_date'] = $date;

        $todaysDate = strtotime( date( 'Y-m-d' ) );
        if ( $postDate > $todaysDate ) {
            $data['post_status'] = 'future';
        }
    }
}
return $data;
}

add_filter( 'wp_insert_post_data', 'cfc_reset_sermondate', '99', 1);

Voici la fonction createFromFormat:

function createFromFormat($date_ugly) {
   $schedule = 'Sunday - Sep 15, 2000';
    // %Y, %m and %d correspond to date()'s Y m and d.
    // %I corresponds to H, %M to i and %p to a
    $ugly = strptime($date_ugly, '%A - %b %e, %Y');
    $ymd = sprintf(
        // This is a format string that takes six total decimal
        // arguments, then left-pads them with zeros to either
        // 4 or 2 characters, as needed
        '%04d-%02d-%02d',
        $ugly['tm_year'] + 1900,  // This will be "111", so we need to add 1900.
        $ugly['tm_mon'] + 1,      // This will be the month minus one, so we add one.
        $ugly['tm_mday'], 
        $ugly['tm_hour'], 
        $ugly['tm_min'], 
        $ugly['tm_sec']
    );
    $new_schedule = new DateTime($ymd);
    return $new_schedule->format('Y-m-d');
}

Custom Date Calendar

Missed Schedule Error

1
Caleb

WordPress possède cette fonctionnalité: en définissant la date de publication sur le futur dans la zone "Publier" de WordPress, la publication se verra attribuer le statut "futur" et sera programmée pour être publiée à cette date.

Je suppose que le problème se pose parce que vous n'avez pas défini l'heure GMT - c'est ce que WordPress utilise pour planifier les publications. Ou bien vous êtes connecté après la planification.

Le moyen "facile" (mais vous laisse avec deux "boîtes de viande de date de publication" - ce qui du point de vue de l'interface utilisateur n'est pas génial).

Gardez à l'esprit que WP attend la date au format Y-m-d H:i:s

add_action('save_post', 'wpse50448_schedule_sermon');

function wpse50448_schedule_sermon($post_id) {

    //Perform checks, nonces etc

    $date='';//set date
    $date_gmt='';//set date in GMT (UTC)

    // unhook this function so it doesn't loop infinitely
    remove_action('save_post', 'wpse50448_schedule_sermon');

    // update the post, which calls save_post again
    wp_update_post(array('ID' => $post_id, 'post_date' => $date,'post_date_gmt' => $date_gmt));

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

Cela devrait fonctionner, mais n'est pas testé!

Alternative

Vous pouvez également dés-enregistrer le métabox de publication et le réenregistrer avec exactement la même balise (mais avec certaines balises ID modifiées, javascript de WP l'ignore, puis lui appliquez votre propre javascript). Du point de vue de l'interface utilisateur, c'est beaucoup mieux, mais un peu plus complexe.

La première partie est décrite dans ce post pour un autre métabox.

1
Stephen Harris