web-dev-qa-db-fra.com

Formatage de la méta-boîte personnalisée, date de AAAA/MM/JJ en une alternative plus lisible

QUESTION

Cela fait suite à une question précédente à laquelle Milo a gracieusement répondu plus tôt ici - Comment trier CPT par méta-valeur personnalisée (date) et renvoyer les messages mois par mois

En bref, je rencontre des problèmes pour formater correctement la date de ma méta-boîte personnalisée dans quelques zones ... À savoir, dans le back-end dans mes colonnes personnalisées, puis dans le front-end dans mon modèle d'archive.

Par exemple, dans mon modèle d'archive, j'essaie de renvoyer la date actuelle à laquelle les publications appartiennent via le code collé ci-dessous, mais lorsque je visite un mois sans publication, mon modèle renvoie à la place la date "janvier 1970".

<?php $calendar_month = get_post_meta($post->ID, 'epr_startdate', TRUE);?>
<?php $this_month = strtotime($calendar_month); ?>
<span id="current_month"><?php echo date( 'F Y', $this_month ); ?></span>

De plus, dans le back-end, j'essaie de l'avoir de telle sorte que si seulement la "date de début" est créée, alors SEULEMENT cette information, alors que si l'utilisateur entre une "date de début" et une "date de fin", alors Réessayez les deux dates, mais lorsque j'utilise l'exemple de code ci-dessous, mes dates de début sont renvoyées en double comme ceci: 3 mars 2013 - 3 mars 2013.

case "eventdate":
                $eventstart = get_post_meta($post->ID, 'epr_startdate', true);
                $eventstart_col = strtotime($eventstart);

                $eventend = get_post_meta($post->ID, 'epr_enddate', true);
                $eventend_col = strtotime($eventend);

                if ( get_post_meta($post->ID, 'epr_startdate', true) && ! get_post_meta($post->ID, 'epr_enddate', true) )
                    echo date( 'M n, Y', $eventstart_col );
                elseif ( get_post_meta($post->ID, 'epr_enddate', true) )
                    echo date( 'M n, Y', $eventstart_col ) . ' &mdash; ' . date( 'M n, Y', $eventend_col );
                else
                    echo 'NA';
                break;

Merci d'avance pour votre temps.
Meilleur


SOLUTION FINALE

Un grand merci à s_ha_dum pour sa patience et son soutien!
Les solutions de travail finales à ma question sont collées ci-dessous ...

Affiche correctement la date à laquelle il n’ya pas de messages pour le mois actuellement demandé:

<?php $this_month = strtotime($calendar_month);
if (false === $this_month) {
$this_month = strtotime(get_query_var( 'calendar_year' ) . get_query_var( 'calendar_month' ) .'01');
} ?>
<span id="current_month"><?php echo date( 'F Y', $this_month ); ?></span><?php
?>

Colonnes personnalisées:

case "eventdate":
                $start_date = get_post_meta($post->ID, 'epr_startdate', true);
                $start_date_col = strtotime($start_date);           
                $end_date = get_post_meta($post->ID, 'epr_enddate', true);
                $end_date_col = strtotime($end_date);

                if ( $start_date_col && !$end_date_col ) 
                    echo date( 'M d, Y', $start_date_col );
                elseif ( $start_date_col && $end_date_col )
                    echo date( 'M d, Y', $start_date_col ) . ' &mdash; ' . date( 'M d, Y', $end_date_col );  
                else
                    echo 'NA';
                break;

Redirection/calendrier ->/calendrier/aaaa/mm:

function redirect_empty_archive() {
$m = get_query_var('calendar_month');
$y = get_query_var('calendar_year');
    if (
        is_post_type_archive('calendar') &&
        ( empty($m) || empty($y) )
    ) {
        wp_safe_redirect( '/calendar' . date('/Y/m') );
    }
}
add_action('template_redirect','redirect_empty_archive');
3
Mr.Brown

mais lorsque je visite un mois sans publication, mon modèle renvoie plutôt la date "janvier 1970".

Oui. Ça va arriver. UNIXTIME a commencé le 1er janvier 1970. Il s'agit de "0000/00/00", mais les nombres négatifs sont conservés jusqu'en 1901. strtotime renverra false pour tout ce qui est en dehors de cette plage, y compris vos dates inexistantes. date assumera le "jour zéro" si une mauvaise date est donnée. Par conséquent, vous obtenez le 1er janvier 1970 pour des dates inexistantes ou autrement imparfaites. Les machines 64 bits peuvent gérer de plus grandes plages, si je me souviens bien. De toute façon, une date inexistante vous donnera 1970. Essayez:

$calendar_month = "1901/01/01";
$this_month = strtotime($calendar_month);
var_dump($this_month);
echo '<br />';
echo date('Y',$this_month);
echo '<br />';

Vous voulez vous assurer que vous avez une bonne date avant de l'afficher.

<?php $this_month = strtotime($calendar_month); 
if (false !== $this_month) { ?>
  <span id="current_month"><?php echo date( 'F Y', $this_month ); ?></span><?php
}

Votre autre code est un peu volumineux, mais il devrait fonctionner, sauf que votre format de date est incorrect. Vous n'obtenez pas "Mois Jour, Année" comme je suppose que vous voulez, mais "Nom du mois Numéro-Mois, Année", qui ressemblera à un duplicata si les deux dates sont identiques. Regardez bien les opérateurs de formatage date .

$eventstart = get_post_meta($post->ID, 'epr_startdate', true);
$eventstart_col = strtotime($eventstart);

$eventend = get_post_meta($post->ID, 'epr_enddate', true);
$eventend_col = strtotime($eventend);

if ( $eventstart_col && !$eventend_col ) {
    // only the start date
    echo date( 'M d, Y', $eventstart_col );
} elseif ( $eventstart_col && $eventend_col ) {
    // both start and end date
    echo date( 'M d, Y', $eventstart_col ) . ' &mdash; ' . date( 'M d, Y', $eventend_col );  
} else {
    echo 'NA';
}

Je pense que cela a été remonté correctement.

2
s_ha_dum