web-dev-qa-db-fra.com

Comment afficher la date de publication réelle dans un brouillon

Lorsque vous examinez un brouillon de publication, get_the_date() ne semble renvoyer que la date du jour, pas la date de publication, même si j'ai sélectionné une autre date sur l'écran de modification.

Est-il possible d'afficher la date de publication "réelle", celle que j'ai sélectionnée?

Je peux voir dans la base de données MySQL qu'il est enregistré dans la colonne post_date. Mais, comme get_the_date, $post->post_date ne le renvoie pas. Si le message est un brouillon, il affiche la date et l'heure actuelles.

3
supertrue

Oui, comme vous - jusqu'à présent - n'avez pas de date de publication.

Vous pouvez utiliser $post->post_modified, qui sera toujours la date de la dernière modification apportée aux données de publication.


Debug:

Essayez de vous accrocher au filtre et de vider les deux vars:

function date_dump_callback( $date, $d )
{
    echo '<pre>'; print_r( $date ); print_r( $d ); echo '</pre>';
    return $date;
}
add_filter( 'get_the_date', 'date_dump_callback', 20, 2 );
7
kaiser

Je ne sais pas pourquoi il modifie les données de cette manière lors de l'affichage, mais vous pouvez utiliser

$post->post_date_gmt

La date de publication programmée sera alors identique à celle de la base de données, à l'exception du format de l'heure GMT. Vous devrez peut-être d'abord convertir l'heure dans votre fuseau horaire local ( ). aide ). Sinon, vous devriez pouvoir l’utiliser tel quel si vous utilisez uniquement la date et pas l’heure, mais cela dépend de ce que vous faites avec.

Modifier le 29/02/12:

Je voulais développer ma réponse pour la rendre plus complète et vous donner quelque chose que vous pouvez réellement utiliser.

Vous avez raison, la date de publication est stockée dans le champ post_date de la base de données.

Par exemple, wordpress utilise cette ligne de code dans wp-admin/includes/meta-boxes.php pour définir la variable utilisée pour afficher la date de publication pour les brouillons planifiés pour l'avenir:

$date = date_i18n( $datef, strtotime( $post->post_date ) );

Cependant, lorsque vous utilisez le même code pour l'affichage au terminal, il renvoie l'heure actuelle, comme vous l'avez dit. Je pense que nous pouvons conclure que les données d'objet $post sont préparées différemment pour le début.

Quoi qu'il en soit, il est possible d'afficher la même date planifiée que vous avez définie dans l'administrateur.

Parce qu'il semble que nous ne pouvons pas utiliser $post->post_date, nous pouvons utiliser $post->post_date_gmt comme je l'ai déjà dit - le seul inconvénient est que votre fuseau horaire n'est probablement pas le même que celui de GMT. Il vous suffit donc d'extraire la valeur GMT et de la convertir dans votre fuseau horaire.

Vous pouvez ajouter cette fonction à votre functions.php et l'appeler où vous voulez:

<?php
/**
*@param string $datef (optional) to pass the format you want for the returned date string
*@return string
*/
function get_the_real_post_date($datef = 'M j, Y @ G:i') {

    global $post;

    if ( !empty( $timezone_string = get_option( 'timezone_string' ) ) )  {

        $timezone_object = timezone_open( $timezone_string );
        $datetime_object = date_create( $post->post_date_gmt );

        $offset_sec = round( timezone_offset_get( $timezone_object, $datetime_object ) );
        // if you want $offset_hrs = round( $offset_sec / 3600 );

        return date_i18n( $datef, strtotime( $post->post_date_gmt ) + $offset_sec );

    } elseif (!empty( $offset_hrs = get_option('gmt_offset') ) ) {

        // this option shows empty for me so I believe it's only used by WP pre 3.0
        // the option stores an integer value for the time offset in hours

        $offset_sec = $offset_hrs * 3600;
        return date_i18n( $datef, strtotime( $post->post_date_gmt ) + $offset_sec );

    } else {

        return;  // shouldn't happen but...

    }
}

Bien entendu, vous pouvez également modifier le format d’heure par défaut défini dans la définition du paramètre si vous utilisez un format particulier.

Faites-moi savoir si cela fonctionne pour vous. Je suis curieux, pourquoi utilisez-vous la date?

3
Evan Mattson

Vous pouvez afficher la date prévue pour un brouillon de publication en lisant la base de données à l'aide de la classe wpdb via la variable globale $ wpdb fournie par Worpdress (voir http://codex.wordpress.org/Class_Reference/wpdb ).

Ajoutez ceci à votre functions.php:

// function to get scheduled date for draft post
function unpublished_draft_date(){
  global $wpdb; global $post;
  $post_id = $post->ID;
  $draft_date_array = $wpdb->get_results( 'SELECT post_date FROM wp_posts WHERE ID = '.$post_id );
  $draft_date = $draft_date_array[0]->post_date;
  return $draft_date;
}

Et ceci dans votre boucle de publication:

echo unpublished_draft_date();

J'ai fourni juste le code de base pour obtenir la date que vous vouliez. Il est facile de former la date si vous avez besoin et d'entrer un identifiant de publication dans la fonction si vous ne souhaitez pas utiliser l'identifiant de publication actuel ou si vous souhaitez utiliser la fonction en dehors de la boucle.

Veuillez commenter ci-dessous si vous avez besoin d'instructions plus spécifiques.

0
jounileander

Dans mes brouillons, $ post-> post_date_gmt est juste 0000-00-00 00:00:00 - supertrue 4 juin à 15:08

Il n'y a aucun moyen de modifier la date de publication d'un brouillon qui n'a pas encore été publié. La valeur de post_date_gmt sera 0000-00-00 00:00:00 jusqu'à ce que le message soit publié.

Assurez-vous que le message a été publié au moins une fois. La visibilité peut être définie sur privée si vous ne souhaitez pas la publier. Une fois celle-ci publiée, vous pouvez modifier la date et la sauvegarder comme valeur pour post_date et post_date_gmt indéfiniment, à moins que vous ne la changiez à nouveau. Les valeurs post_modified et post_modified_gmt continueront à changer chaque fois que vous modifierez la publication.

J'ai testé cela et post_date_gmt sera défini sur la date et l'heure actuelles lors de la publication de la publication avec visibilité définie sur privé. Vous pouvez également modifier la date à ce stade et elle devrait être mise à jour.

Si vous pouvez modifier et enregistrer une date sur l'écran d'édition d'un brouillon (ce que vous pouvez) - supertrue 29 févr. 12 à 1:36

Non, vous ne pouvez pas modifier et enregistrer une date sur l'écran d'édition d'un brouillon. Avant de publier un brouillon, cette même zone de la métabox "Publier" de l'éditeur de publication est utilisée pour planifier la date de publication ultérieure du message. Bien sûr, vous ne pourrez pas définir une date ou une heure passée pour la planification et la date future ne sera probablement pas définie pour post_date_gmt tant qu'elle ne sera pas publiée.

0
iyrin