Как следует обрабатывать данные в WordPress?

Добрый день! Подскажите, как корректно реализовать следующую задачу. При загрузке страницы сайта на WordPress необходимо выполнить запрос к базе данных для получения 10 записей. Затем следует обрабатывать каждую запись по очереди: после обработки первой записи пользователь нажимает кнопку, и отображается вторая запись, и так далее до конца списка. После завершения работы с текущими записями нужно записать результаты в базу и вновь запросить следующие 10 записей. Это подобно тому, как работает сайт Duolingo, где пользователю показывается слово, он вводит его перевод, нажимает кнопку для проверки, и затем появляется новое слово. 

Как наилучшим образом организовать этот алгоритм? Где лучше хранить переменную, указывающую на номер последней выбранной записи из базы: должна ли она быть глобальной? Какие операции следует выполнить на PHP, а какие на JavaScript? Есть ли в WordPress функции, которые помогут мне в этом, без необходимости использовать плагины? Следует ли хранить выбранные 10 записей в массиве на PHP, и как обеспечить доступ к ним из функций JavaScript?
  • 17 октября 2024 г. 17:22
Ответы на вопрос 2
Для реализации вашего сценария на WordPress, можно использовать комбинацию PHP и JavaScript (например, с использованием AJAX), а также некоторые базовые функции WordPress для работы с базой данных. Вот как вы можете организовать этот алгоритм:

### 1. Определение структуры базы данных

Вы уже должны иметь таблицу в базе данных с данными, которые хотите обрабатывать. Например, таблица может называться `wp_custom_records` и содержать следующие поля:
- `id` (идентификатор записи)
- `content` (содержимое записи)
- `processed` (флаг, указывающий на то, обработана запись или нет)

### 2. Создание PHP функции для получения записей

Создайте функцию, которая будет получать 10 непросмотренных записей из базы данных:

```php
function get_records($offset) {
    global $wpdb;
    $table_name = $wpdb->prefix . 'custom_records';
    $results = $wpdb->get_results("SELECT * FROM $table_name WHERE processed = 0 LIMIT 10 OFFSET $offset", ARRAY_A);
    return $results;
}
```

### 3. Создание AJAX обработчика

Создайте AJAX обработчик для загрузки новых записей. Добавьте следующий код в файл `functions.php` вашей темы:

```php
add_action('wp_ajax_get_new_records', 'get_new_records_callback');
add_action('wp_ajax_nopriv_get_new_records', 'get_new_records_callback');

function get_new_records_callback() {
    $offset = isset($_POST['offset']) ? intval($_POST['offset']) : 0;
    $records = get_records($offset);
    wp_send_json($records);
}
```

### 4. Создание JavaScript для интерактивности

Добавьте следующий JavaScript в вашем шаблоне для обработки событий и взаимодействия с сервером:

```html
<script type="text/javascript">
    let currentRecordIndex = 0;
    let records = [];

    function fetchNewRecords() {
        let data = {
            'action': 'get_new_records',
            'offset': currentRecordIndex
        };

        jQuery.post(ajaxurl, data, function(response) {
            if (response.length) {
                records = response;
                displayRecord(currentRecordIndex);
            }
        });
    }

    function displayRecord(index) {
        if (index < records.length) {
            // Обновите HTML с записями
            document.getElementById('record').innerText = records[index].content;
        } else {
            // Обработка завершена
            alert("Все записи обработаны.");
        }
    }

    function processRecord() {
        // Код для обработки записи и записи результата в базу
        // Например, изменение флага processed в базе данных на 1

        // После обработки:
        currentRecordIndex++;
        displayRecord(currentRecordIndex);
    }

    document.addEventListener('DOMContentLoaded', function() {
        fetchNewRecords();

        document.getElementById('next-button').addEventListener('click', processRecord);
    });
</script>

<div id="record"></div>
<button id="next-button">Следующий</button>
```

### 5. Обновление базы данных после обработки записи

Не забудьте написать функцию для обновления записи в базе данных после обработки. Вы можете сделать это через AJAX или же методом использования `wp_update` или `wpdb->update`.

### 6. Хранение состояния

Хранение переменной, указывающей на номер текущей записи, можно реализовать на клиентской стороне (в JavaScript). Таким образом, состояние будет сохраняться в переменной `currentRecordIndex`.

### 7. Переход к следующим записям

При завершении обработки всех текущих записей, вы можете снова вызвать `fetchNewRecords()` для загрузки следующих 10 записей.

### Итог

Этот подход позволяет вам использовать WordPress функции для работы с базой данных, а также применить AJAX для динамического обновления содержимого страницы без перезагрузки. Такой способ обеспечивает хорошую производительность и пользовательский опыт, схожий с Duolingo.
Для начала выбросить WP и сделать нормально. 
Но в общем случае:
Создаете форму со всеми вопросами и показывает по одному, переключая через JS вопросы. В конце отправляете всю форму.
или
Если следующий вопрос зависит от ответа на предыдущий, то отправляете ajax-ом каждый вопрос отдельно и в ответе с бэкенда возвращаете следующий вопрос. Все необходимые данные (типа ID вопроса) можно хранить и обновлять в data-атрибутах.
Похожие вопросы