javascript onload вызывает функцию плагина

Вопрос или проблема

Друг создал для меня плагин, который позволяет пользователям помечать сообщения как прочитанные или непрочитанные. Код этого плагина выглядит следующим образом:

редактирование кода!

<?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, чтобы пометить пост как прочитанный, когда пользователь открывает его. Для этого вам нужно будет сделать следующее:

  1. Получить ID поста.
  2. Выполнить 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-запросы в вашем плагине. Если у вас есть дополнительные вопросы или вам нужна помощь с конкретной частью кода, не стесняйтесь спрашивать!

Оцените материал
Добавить комментарий

Капча загружается...