Intereting Posts
Можно ли установить User-Agent при чтении удаленного файла с помощью readfile () в php? WooCommerce – получать активные подписки в списке между датой начала и окончания Получите широту и долготу всего местоположения, которые находятся в радиусе 10 км от моего текущего местоположения с помощью карты google (с использованием PHP) Возможная инъекция из строки даты Выберите запрос Почему PDO печатает мой пароль при сбое соединения? CURL CSRF Token Как обновить с mysql_ * до mysqli_ *? сборка мусора php при запуске скрипта Структура приложения facebook с минимальными вызовами api Как я могу удалить iframe-вирус из всех php-файлов на моем сайте? Рабочий пример PayPal Website Payments Pro Hosted Solution Iframe? Передать переменные с url в php, поскольку я интегрирую платежный шлюз в wordpress payu Symfony 3.4 Используйте представление внутри моего пакета сопоставление импорта magento xml Двоичные данные не сохраняются должным образом в MySQL

Как подсчитать общее количество сообщений из выбранных типов сообщений?

Я хочу создать панель уведомлений на моем веб-сайте 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; 

Подсчет сообщений, чтобы определить, есть ли новое сообщение, тратит впустую ресурсы и неточно, поскольку переход на статус сообщения может влиять на счет. Например, как вы сказали, если сообщение удалено и опубликовано новое, счет останется таким же

Чтобы выполнить эту работу, нам необходимо выполнить следующий рабочий процесс

WORKSFLOW

Нам нужно определить, когда публикация публикуется. Это можно сделать с помощью 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

Вы должны быть в состоянии упростить свой код, если хотите только общее количество всех сообщений.