Я хочу создать панель уведомлений на моем веб-сайте WordPress, который будет отображаться при публикации новой публикации. К сожалению, у меня есть некоторые проблемы с работой кода.
Цель состоит в том, чтобы сообщить пользователю, что есть новые сообщения, доступные для них на веб-сайте, с панелью уведомлений. Поэтому код должен проверять, увеличивается ли количество сообщений. Если да, я хочу показать панель уведомлений на веб-сайте в течение двух дней.
Следующий код выводит только общее количество сообщений из каждого типа сообщений, которые я указал в массиве $post_types
. Оператор if работает неправильно. Когда я публикую новое сообщение, удаляю его и публикую другое, он не будет обновлять номер в базе данных. Только если я опубликую после удаления старого, значение будет увеличиваться.
В приведенном ниже коде теперь будет отображаться только имя типа сообщения и количество сообщений.
$args = array( 'public' => true, '_builtin' => false ); $post_types = array( 'post', 'roosters', 'downloads', 'reglements', 'alv' ); foreach ( $post_types as $post_type ) { // variable $postCountTotal = wp_count_posts( $post_type )->publish; echo '<strong>' . $post_type . '</strong>'; echo ' has total posts of : ' . $postCountTotal; echo '<br>'; // First read the previous post count value from the databse so we can compare the old value with the new one // EDIT: use 0 as the default value if no data in database - first run $previousCount = get_option( 'post_count_total', 0 ); if ( $postCountTotal != $previousCount ) { //echo 'New post detected'; update_option( 'post_count_total', $postCountTotal ); } elseif ( '' == $postCountTotal && $previousCount ) { delete_option( 'post_count_total', $previousCount ); } } echo $postCountTotal;
Подсчет сообщений, чтобы определить, есть ли новое сообщение, тратит впустую ресурсы и неточно, поскольку переход на статус сообщения может влиять на счет. Например, как вы сказали, если сообщение удалено и опубликовано новое, счет останется таким же
Чтобы выполнить эту работу, нам необходимо выполнить следующий рабочий процесс
Нам нужно определить, когда публикация публикуется. Это можно сделать с помощью hook_post_status. Этот крючок запускается каждый раз, когда статус сообщения изменяется. Даже если сообщение обновляется, его статус изменяется.
Мы должны делать только что-то, когда публикуется новая публикация, поэтому нам нужно проверить статус сообщения до и после ее публикации («новый» статус здесь не работает, как я ожидал, что он работает, поэтому я отказался от этой идеи) ,
Следующим будет сохранение нового объекта post в таблице wp_options
где мы можем получить его позже в шаблоне и использовать его для отображения панели уведомлений. Функции, которые будут использоваться здесь, будут add_option()
чтобы создать наш вариант, если он не существует, и update_option()
если этот параметр уже существует.
Объект post теперь сохраняется в таблице wp_options
. Теперь мы должны получить эту опцию в файле функций или шаблонов. Мы будем использовать get_option()
. Из сохраненного объекта post нам нужно будет получить post_date_gmt
, чтобы использовать его для comaprison, и нам нужно определить точное время через 2 дня
Нам также нужно текущее время, которое мы можем получить с current_time()
В конечном итоге мы можем сравнить даты, и если даты, которые мы сравниваем, составляют менее двух дней, нам нужно сделать все возможное, показать панель уведомлений, если сравнение более двух дней, мы либо ничего не показываем, либо что-то другое
Вот окончательный код. Я прокомментировал это так, чтобы вы могли следить за ним
В your functions.php добавьте следующее
add_action( 'transition_post_status', function ( $new_status, $old_status, $post ) { //Check if our post status then execute our code if ( $new_status == 'publish' && $old_status != 'publish' ) { if ( get_option( 'new_post_notification' ) !== false ) { // The option already exists, so we just update it. update_option( 'new_post_notification', $post ); } else { add_option( 'new_post_notification', $post ); } } }, 10, 3 );
Теперь, в вашем шаблоне или в пользовательской функции, если хотите, добавьте следующее
// Get the new_post_notification which holds the newest post $notification = get_option( 'new_post_notification' ); if( false != $notification ) { //Get the post's gmt date. This can be changed to post_date $post_date = strtotime( $notification->post_date_gmt ); //Get the current gmt time $todays_date = current_time( 'timestamp', true ); //Set the expiry time to two days after the posts is published $expiry_date = strtotime('+2 day', $post_date); if( $expiry_date > $todays_date ) { // Display your notification if two days has not been passed } }
Для этого есть встроенная функция WP:
<?php $count_posts = wp_count_posts(); ?>
Хорошая документация доступна в WP Codex: http://codex.wordpress.org/Function_Reference/wp_count_posts
Вы должны быть в состоянии упростить свой код, если хотите только общее количество всех сообщений.