По умолчанию стандартный календарь вордпресса выводин только сообщения со статусом «publish«.
И так как запранированные страницы вносятся со статусом «future«, они не появляются в календаре.
Давайте попробуем это исправить (медот костыльный)
Для начала создадим фаил новой страницы, которая быдет нам выводить запланированные страницы и накоторую мы будем переадресовывать пользователей для просмотра этиъ самых событий.
КОД СТРАНИЦЫ
Код:
<?php
/*
Template Name: Планируемые события
*/
?>
<?php get_header(); ?>
<?php
// получаем данные по дате
$content_year = get_query_var( year );
$content_month = get_query_var( month );
$content_day = get_query_var( day );
$my_posts = new WP_Query();
// делаем запрос в бд
$myposts = $my_posts->query( array(
'post_type' => 'post',
'post_status' => 'future',
'year' => $content_year,
'monthnum' => $content_month,
'day' => $content_day,
) );
// обрабатываем полученный результат
foreach( $myposts as $pst ){
echo '<a href="' . esc_html( $pst->guid ) . '"><h3>' . esc_html( $pst->post_title ) . '</h3></a>';
echo '<div>Дата: ' . substr($pst->post_date, 0, 10) . '</div>';
}
?>
<?php get_footer(); ?>
Далее в админке создаем страницу (назовем страницу к примеру Планируемые события).
Выбираем созданный нами шаблон для этой страницы.
Уже можно попробовать вывести запранированные события по ссылке
/?page_id=айди_вашей_страницы&year=2018&month=10&day=3
(дату, год, меся, день, меняйте на необходимый)
Далее исправим сам календарь.
Открываем фаил wp-includes/general-template.php
Ищем функцию function get_calendar
В ней ищем:
Код:
$previous = $wpdb->get_row("SELECT MONTH(post_date) AS month, YEAR(post_date) AS year
FROM $wpdb->posts
WHERE post_date < '$thisyear-$thismonth-01'
AND post_type = 'post' AND post_status = 'publish'
ORDER BY post_date DESC
LIMIT 1");
$next = $wpdb->get_row("SELECT MONTH(post_date) AS month, YEAR(post_date) AS year
FROM $wpdb->posts
WHERE post_date > '$thisyear-$thismonth-{$last_day} 23:59:59'
AND post_type = 'post' AND post_status = 'publish'
ORDER BY post_date ASC
LIMIT 1");
Заменяем на:
Код:
$previous = $wpdb->get_row("SELECT MONTH(post_date) AS month, YEAR(post_date) AS year
FROM $wpdb->posts
WHERE (post_date < '$thisyear-$thismonth-01'
AND post_type = 'post' AND post_status = 'publish') OR (post_date < '$thisyear-$thismonth-01'
AND post_type = 'post' AND post_status = 'future')
ORDER BY post_date DESC
LIMIT 1");
$next = $wpdb->get_row("SELECT MONTH(post_date) AS month, YEAR(post_date) AS year
FROM $wpdb->posts
WHERE (post_date > '$thisyear-$thismonth-{$last_day} 23:59:59'
AND post_type = 'post' AND post_status = 'publish') OR (post_date > '$thisyear-$thismonth-{$last_day} 23:59:59'
AND post_type = 'post' AND post_status = 'future')
ORDER BY post_date ASC
LIMIT 1");
Этим мы настроили вывод кнопок перелистывания месяцев.
Далее настроим вывод дней.
Находим:
Код:
$dayswithposts = $wpdb->get_results("SELECT DISTINCT DAYOFMONTH(post_date)
FROM $wpdb->posts WHERE post_date >= '{$thisyear}-{$thismonth}-01 00:00:00'
AND post_date <= '{$thisyear}-{$thismonth}-{$last_day} 23:59:59'
AND post_type = 'post' AND post_status = 'publish'", ARRAY_N);
Заменяем на:
Код:
$dayswithposts = $wpdb->get_results("SELECT DISTINCT DAYOFMONTH(post_date)
FROM $wpdb->posts WHERE (post_date >= '{$thisyear}-{$thismonth}-01 00:00:00'
AND post_date <= '{$thisyear}-{$thismonth}-{$last_day} 23:59:59'
AND post_type = 'post' AND post_status = 'publish') OR (post_date >= '{$thisyear}-{$thismonth}-01 00:00:00'
AND post_date <= '{$thisyear}-{$thismonth}-{$last_day} 23:59:59'
AND post_type = 'post' AND post_status = 'future')", ARRAY_N);
Осталось заменить ссылки «запланированных» дней на нашу созданную страницу.
Находим:
Код:
if ( in_array( $day, $daywithpost ) ) {
// any posts today?
$date_format = date( _x( 'F j, Y', 'daily archives date format' ), strtotime( "{$thisyear}-{$thismonth}-{$day}" ) );
/* translators: Post calendar label. 1: Date */
$label = sprintf( __( 'Posts published on %s' ), $date_format );
$calendar_output .= sprintf(
'<a href="%s" aria-label="%s">%s</a>',
get_day_link( $thisyear, $thismonth, $day ),
esc_attr( $label ),
$day
);
} else {
$calendar_output .= $day;
}
Заменяем на:
Код:
if ( in_array( $day, $daywithpost ) ) {
// any posts today?
$date_format = date( _x( 'F j, Y', 'daily archives date format' ), strtotime( "{$thisyear}-{$thismonth}-{$day}" ) );
/* translators: Post calendar label. 1: Date */
$label = sprintf( __( 'Posts published on %s' ), $date_format );
if( time() < strtotime( "{$thisyear}-{$thismonth}-{$day}" ) ){
$calendar_output .= sprintf(
'<a href="%s" aria-label="%s">%s</a>',
"/?page_id=АЙДИ_ВАШЕЙ_СТРАНИЦЫ&year=" . $thisyear . "&month=" . $thismonth . "&day=" . $day,
esc_attr( $label ),
$day
);
} else {
$calendar_output .= sprintf(
'<a href="%s" aria-label="%s">%s</a>',
get_day_link( $thisyear, $thismonth, $day ),
esc_attr( $label ),
$day
);
}
} else {
$calendar_output .= $day;
}
В принципе вот и все. Остается только стилизовать стриницу под свой дизайн и готово)