Вопрос или проблема
Друг создал для меня плагин, который позволяет пользователям помечать сообщения как прочитанные или непрочитанные. Код этого плагина выглядит следующим образом:
редактирование кода!
<?php
/**
* @package Read-Unread
* @version 1.0
*/
/*
Plugin Name: Read-Unread
Plugin URI: http://www.google.fr
Description: Плагин Read-Unread
Author: Moi
Version: 1.0
Author URI: http://www.google.fr
*/
global $wpdb;
$table_name = $wpdb->prefix . "users_read";
$sql = "CREATE TABLE IF NOT EXISTS `$table_name` (
`ID_USER` int(11) NOT NULL,
`ID_POST` int(11) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=latin1;";
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $sql );
function all_css()
{
echo '
<style>
.post-read
{
cursor: pointer;
}
</style>';
}
function all_js()
{
echo '
<script>
jQuery(function($)
{
$(".post-read").click(function()
{
action = $(this).data("action");
if($(this).data("action") == "read")
{
$(this).attr("src", "http://corentinbuet.fr/wordpress/wp-content/plugins/Read-Unread/LU.png");
$(this).attr("title", "Пометить как Непрочитанное");
$(this).data("action", "unread");
}
else
{
$(this).attr("src", "http://corentinbuet.fr/wordpress/wp-content/plugins/Read-Unread/NON_LU.png");
$(this).attr("title", "Пометить как Прочитанное");
$(this).data("action", "read");
}
postID = $(this).data("id");
var data = {
"action": action,
"idPost": postID
};
$.post("/wp-admin/admin-ajax.php", data, function(response)
{
});
});
});
</script>';
}
function ajax_read() {
global $wpdb;
$idUser = intval(get_current_user_id());
$idPost = intval($_POST['idPost']);
$table = $wpdb->prefix . "users_read";
$data = array('ID_USER' => $idUser, 'ID_POST' => $idPost);
$format = array('%d','%d');
$res = $wpdb->insert( $table, $data, $format );
if($res == false)
{
return 1;
}
return 0;
die();
}
function ajax_unread() {
global $wpdb;
$idUser = intval(get_current_user_id());
$idPost = intval($_POST['idPost']);
$table = $wpdb->prefix . "users_read";
$where = array('ID_USER' => $idUser, 'ID_POST' => $idPost);
$where_format = array('%d','%d');
$res = $wpdb->delete( $table, $where, $where_format );
if($res == false)
{
return 1;
}
return 0;
die();
}
add_action( 'wp_ajax_read', 'ajax_read' );
add_action( 'wp_ajax_unread', 'ajax_unread' );
function get_img_read_unread()
{
global $wpdb;
$idUser = intval(get_current_user_id());
$idPost = intval(get_the_ID());
$msg = '';
if($idUser > 0 && $idPost > 0)
{
$read = $wpdb->get_var( "SELECT COUNT(*) FROM wp_users_read WHERE ID_POST=$idPost AND ID_USER=$idUser");
if($read == 1)
{
echo '<img class="post-read" data-action="unread" data-id="' . $idPost . '" src="http://corentinbuet.fr/wordpress/wp-content/plugins/Read-Unread/LU.png" title="Пометить как Непрочитанное">';
}
else
{
echo '<img class="post-read" data-action="read" data-id="' . $idPost . '" src="http://corentinbuet.fr/wordpress/wp-content/plugins/Read-Unread/NON_LU.png" title="Пометить как Прочитанное">';
}
}
}
function add_button($content)
{
global $wpdb;
$idUser = intval(get_current_user_id());
$idPost = intval(get_the_ID());
$msg = '';
if($idUser > 0 && $idPost > 0)
{
$read = $wpdb->get_var( "SELECT COUNT(*) FROM wp_users_read WHERE ID_POST=$idPost AND ID_USER=$idUser");
if($read == 1)
{
$msg = '<img class="post-read" data-action="unread" data-id="' . $idPost . '" src="http://corentinbuet.fr/wordpress/wp-content/plugins/Read-Unread/LU.png" title="Пометить как Непрочитанное">';
}
else
{
$msg = '<img class="post-read" data-action="read" data-id="' . $idPost . '" src="http://corentinbuet.fr/wordpress/wp-content/plugins/Read-Unread/NON_LU.png" title="Пометить как Прочитанное">';
}
}
$posttype = get_post_type( get_the_ID() );
if ($posttype == post)
{
return $content . $msg;
}
else
{
return $content;
}
}
add_filter('the_content', 'add_button');
add_action( 'wp_footer', 'all_js' );
add_action( 'wp_head', 'all_css' );
?>
Я хотел бы пометить сообщение как прочитанное, когда сообщение открыто пользователем. Как я могу это сделать?
Если я неясен, пожалуйста, дайте знать, и я постараюсь объяснить лучше.
Спасибо.
Корентин
Я это не тестировал, но что-то вроде этого должно работать. Измените функцию all_js
в вашем файле плагина и добавьте эти строки:
$.post("/wp-admin/admin-ajax.php", {
idPost: $(".post-read").data("id"),
action: "read"
}, function(response) {
// Обработка ошибок и т.д.
});
Вам также нужно убедиться, что данные кнопки изменяются, когда выполняется AJAX-запрос.
Вот улучшенный скрипт (все еще далек от идеала, но это улучшение):
jQuery(function($)
{
var button = $(".post-read"),
postId = button.data("id");
// Обновляет атрибуты кнопки, чтобы соответствовать её атрибуту data-action
function updateButton() {
if(button.data("action") == "unread")
{
button.attr("src", "http://corentinbuet.fr/wordpress/wp-content/plugins/Read-Unread/LU.png");
button.attr("title", "Пометить как Непрочитанное");
}
else
{
button.attr("src", "http://corentinbuet.fr/wordpress/wp-content/plugins/Read-Unread/NON_LU.png");
button.attr("title", "Пометить как Прочитанное");
}
}
// Пометить сообщение как прочитанное
$.post("/wp-admin/admin-ajax.php", {
idPost: postId,
action: "read"
}, function(response) {
// Обработка ошибок и т.д.
button.data('action', 'unread');
updateButton();
});
$(".post-read").click(function()
{
// Исправление: объявить переменную
var action = button.data("action");
var data = {
"action": action,
"idPost": postId
};
$.post("/wp-admin/admin-ajax.php", data, function(response)
{
// Проверка на ошибки и т.д.
// Обновить кнопку
button.data("action", (action == "read") ? "unread" : "read");
updateButton();
});
});
});
Ответ или решение
В вашем вопросе рассматривается проблема внедрения функции пометки поста как прочитанного в плагин WordPress, который был разработан вашим другом. Давайте подробно разберем, как подготовить ваш JavaScript-код, чтобы вызвать нужную функцию при загрузке страницы, а также определить действия, которые должны произойти при открытии поста.
Шаг 1: Модификация функции all_js
Первым делом, мы добавим AJAX-запрос в вашу функцию all_js
, чтобы пометить пост как прочитанный, когда пользователь открывает его. Для этого вам нужно будет сделать следующее:
- Получить ID поста.
- Выполнить AJAX-запрос к
admin-ajax.php
с данными о действии (пометить как прочитанный).
Вот пример того, как можно модифицировать вашу функцию all_js
:
function all_js() {
echo '
<script>
jQuery(function($)
{
var button = $(".post-read"),
postId = button.data("id");
// Функция для обновления кнопки в зависимости от состояния
function updateButton() {
if(button.data("action") == "unread")
{
button.attr("src", "http://corentinbuet.fr/wordpress/wp-content/plugins/Read-Unread/LU.png");
button.attr("title", "Маркировать как Непрочитанное");
}
else
{
button.attr("src", "http://corentinbuet.fr/wordpress/wp-content/plugins/Read-Unread/NON_LU.png");
button.attr("title", "Маркировать как Прочитанное");
}
}
// Пример AJAX-запроса для пометки поста как прочитанного при загрузке
$.post("/wp-admin/admin-ajax.php", {
idPost: postId,
action: "read"
}, function(response) {
button.data('action', 'unread');
updateButton();
});
// Обработчик клика для кнопки
button.click(function()
{
var action = button.data("action"),
data = {
"action": action,
"idPost": postId
};
$.post("/wp-admin/admin-ajax.php", data, function(response)
{
button.data("action", (action == "read") ? "unread" : "read");
updateButton();
});
});
});
</script>';
}
Шаг 2: Убедитесь, что данные корректные
Ваша логика в updateButton
должна правильно реагировать на нажатия и состояния. В этом коде при загрузке страницы будет выполнен AJAX-запрос, который пометит пост как прочитанный. Также предусмотрена функция обновления картинки и текста кнопки в зависимости от ее состояния.
Шаг 3: Вызов функции при загрузке страницы
Теперь, когда функция all_js
обновлена, при каждом открытии поста будет автоматически отправлен AJAX-запрос для пометки поста как прочитанного. Таким образом, вам не нужно беспокоиться о том, чтобы каждый раз нажимать на кнопку.
Убедитесь в функциональности
Перед применением и тестированием изменений убедитесь, что:
- Все пути и параметры правильно указаны.
- Вы не забыли добавить все необходимые шорткоды или вызвать функции плагина в вашем шаблоне.
- Проверьте, что кнопка работает для всех пользователей, а не только для администраторов.
Таким образом, вы сможете помечать посты как прочитанные при их открытии, используя обновленный JavaScript-код и AJAX-запросы в вашем плагине. Если у вас есть дополнительные вопросы или вам нужна помощь с конкретной частью кода, не стесняйтесь спрашивать!