Как сделать чтобы код плагина делал сам по себе и определенная часть отрабатывала раз в 15 мин?
<?php /** * Plugin Name: Univers * Description: Опис вашого плагіна. * Version: 1.0 * Author: Ycommerce */ // Функція, яка виводить вміст сторінки адміністратора function your_plugin_admin_page() { ?> <div class="wrap"> <h2>Univers</h2> <?php // Параметри підключення до бази даних $host = 'localhost'; $database = 'meatcard_uniforce'; $username = 'u_gavno'; $password = '1e8Ff33lYl34'; // Підключення до бази даних $connection = new mysqli($host, $username, $password, $database); // Перевірка наявності помилок при підключенні if ($connection->connect_error) { die("Помилка підключення до бази даних: " . $connection->connect_error); } // Отримання даних з таблиці "catalog" $query = "SELECT id, id_uf, sku, units, units_flag, price, discount, status_id, update_status, update_date, update_status_uf, update_date_uf FROM catalog"; $result = $connection->query($query); // Виведення результатів if ($result->num_rows > 0) { echo '<table>'; echo '<tr>'; echo '<th>ID</th>'; echo '<th>ID_UF</th>'; echo '<th>SKU</th>'; echo '<th>Units</th>'; echo '<th>Units_Flag</th>'; echo '<th>Price</th>'; echo '<th>Discount</th>'; echo '<th>Status_ID</th>'; echo '<th>Update_Status</th>'; echo '<th>Update_Date</th>'; echo '<th>Update_Status_UF</th>'; echo '<th>Update_Date_UF</th>'; echo '</tr>'; while ($row = $result->fetch_assoc()) { echo '<tr>'; echo '<td>' . $row['id'] . '</td>'; echo '<td>' . $row['id_uf'] . '</td>'; echo '<td>' . $row['sku'] . '</td>'; echo '<td>' . $row['units'] . '</td>'; echo '<td>' . $row['units_flag'] . '</td>'; echo '<td>' . $row['price'] . '</td>'; echo '<td>' . $row['discount'] . '</td>'; echo '<td>' . $row['status_id'] . '</td>'; echo '<td>' . $row['update_status'] . '</td>'; echo '<td>' . $row['update_date'] . '</td>'; echo '<td>' . $row['update_status_uf'] . '</td>'; echo '<td>' . $row['update_date_uf'] . '</td>'; echo '</tr>'; // Включити WooCommerce функціонал include_once('wp-load.php'); // Задати артикул товару, який ви шукаєте $product_sku = $row['sku']; // Замініть це на реальний артикул // Отримати товар за його артикулом $product = wc_get_product_id_by_sku($product_sku); // Перевірити, чи існує товар з вказаним артикулом if ($product) { // Отримати об'єкт товару за його ID $product = wc_get_product($product); // Оновити дані товару $new_price = '111'; // Нова ціна (у рядковому форматі) // Новий статус $new_measurement = $row['units']; // Новий спосіб вимірювання if ($row['status_id']=='0') { $kol = 0; } if ($row['status_id']=='1') { $kol = 100; } if ($row['status_id']=='3') { $kol = 0; } // Встановити нову ціну $product->set_regular_price($new_price); $product->set_stock_quantity($kol); $product->set_weight($new_measurement); // Зберегти зміни $product->save(); // Вивести повідомлення про оновлення } } echo '</table>'; } else { echo 'Дані не знайдені.'; } // Закриття з'єднання з базою даних $connection->close(); } // Додаємо сторінку в адмінку function your_plugin_add_admin_page() { add_menu_page( 'Univers', // Назва сторінки 'Univers', // Назва в меню 'manage_options', // Рівень доступу (можна змінити на інший за необхідності) 'your-plugin', // Ідентифікатор сторінки 'your_plugin_admin_page', // Функція, яка виводить вміст сторінки 'dashicons-admin-plugins', // Іконка (змініть за необхідності) 99 // Порядковий номер в меню ); } add_action('admin_menu', 'your_plugin_add_admin_page');<code lang="php"> </code> Нужно, чтобы код плагина работал сам по себе без перехода на страницу плагина. И определенная часть отрабатывала раз в 15 мин. |
<?php /** * Plugin Name: Univers * Description: Опис вашого плагіна. * Version: 1.0 * Author: Ycommerce */ // Функція, яка виводить вміст сторінки адміністратора function your_plugin_admin_page() { ?> <div class="wrap"> <h2>Univers</h2> <?php // Параметри підключення до бази даних $host = 'localhost'; $database = 'meatcard_uniforce'; $username = 'u_gavno'; $password = '1e8Ff33lYl34'; // Підключення до бази даних $connection = new mysqli($host, $username, $password, $database); // Перевірка наявності помилок при підключенні if ($connection->connect_error) { die("Помилка підключення до бази даних: " . $connection->connect_error); } // Отримання даних з таблиці "catalog" $query = "SELECT id, id_uf, sku, units, units_flag, price, discount, status_id, update_status, update_date, update_status_uf, update_date_uf FROM catalog"; $result = $connection->query($query); // Виведення результатів if ($result->num_rows > 0) { echo '<table>'; echo '<tr>'; echo '<th>ID</th>'; echo '<th>ID_UF</th>'; echo '<th>SKU</th>'; echo '<th>Units</th>'; echo '<th>Units_Flag</th>'; echo '<th>Price</th>'; echo '<th>Discount</th>'; echo '<th>Status_ID</th>'; echo '<th>Update_Status</th>'; echo '<th>Update_Date</th>'; echo '<th>Update_Status_UF</th>'; echo '<th>Update_Date_UF</th>'; echo '</tr>'; while ($row = $result->fetch_assoc()) { echo '<tr>'; echo '<td>' . $row['id'] . '</td>'; echo '<td>' . $row['id_uf'] . '</td>'; echo '<td>' . $row['sku'] . '</td>'; echo '<td>' . $row['units'] . '</td>'; echo '<td>' . $row['units_flag'] . '</td>'; echo '<td>' . $row['price'] . '</td>'; echo '<td>' . $row['discount'] . '</td>'; echo '<td>' . $row['status_id'] . '</td>'; echo '<td>' . $row['update_status'] . '</td>'; echo '<td>' . $row['update_date'] . '</td>'; echo '<td>' . $row['update_status_uf'] . '</td>'; echo '<td>' . $row['update_date_uf'] . '</td>'; echo '</tr>'; // Включити WooCommerce функціонал include_once('wp-load.php'); // Задати артикул товару, який ви шукаєте $product_sku = $row['sku']; // Замініть це на реальний артикул // Отримати товар за його артикулом $product = wc_get_product_id_by_sku($product_sku); // Перевірити, чи існує товар з вказаним артикулом if ($product) { // Отримати об'єкт товару за його ID $product = wc_get_product($product); // Оновити дані товару $new_price = '111'; // Нова ціна (у рядковому форматі) // Новий статус $new_measurement = $row['units']; // Новий спосіб вимірювання if ($row['status_id']=='0') { $kol = 0; } if ($row['status_id']=='1') { $kol = 100; } if ($row['status_id']=='3') { $kol = 0; } // Встановити нову ціну $product->set_regular_price($new_price); $product->set_stock_quantity($kol); $product->set_weight($new_measurement); // Зберегти зміни $product->save(); // Вивести повідомлення про оновлення } } echo '</table>'; } else { echo 'Дані не знайдені.'; } // Закриття з'єднання з базою даних $connection->close(); } // Додаємо сторінку в адмінку function your_plugin_add_admin_page() { add_menu_page( 'Univers', // Назва сторінки 'Univers', // Назва в меню 'manage_options', // Рівень доступу (можна змінити на інший за необхідності) 'your-plugin', // Ідентифікатор сторінки 'your_plugin_admin_page', // Функція, яка виводить вміст сторінки 'dashicons-admin-plugins', // Іконка (змініть за необхідності) 99 // Порядковий номер в меню ); } add_action('admin_menu', 'your_plugin_add_admin_page');<code lang="php"> </code> Нужно, чтобы код плагина работал сам по себе без перехода на страницу плагина. И определенная часть отрабатывала раз в 15 мин.
Дополнительно:
Переписывай этот плагин. В нём ДЫРИЩА. Матчасть.
А чтобы работал по расписанию нужно создавать функцию запуска и вешать на крон.
А вообще, это все довольно быстро решается, изучив несколько часов основы написания плагинов. У вас даже довольно быстро отпадет вопрос коннекта к БД, т.к. в плагине можно работать с бд средствами вордпресса
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для выполнения части кода плагина раз в 15 минут в WordPress используют WP-Cron или настоящий системный cron. Код не должен выполняться внутри страницы админки при каждом открытии. Админская страница может только показывать статус, а фоновая задача должна жить отдельно.
Вариант через WP-Cron:
add_filter('cron_schedules', function ($schedules) { $schedules['every_15_minutes'] = [ 'interval' => 15 * MINUTE_IN_SECONDS, 'display' => 'Every 15 minutes', ]; return $schedules; }); register_activation_hook(__FILE__, function () { if (!wp_next_scheduled('univers_sync_catalog_event')) { wp_schedule_event(time(), 'every_15_minutes', 'univers_sync_catalog_event'); } }); register_deactivation_hook(__FILE__, function () { wp_clear_scheduled_hook('univers_sync_catalog_event'); }); add_action('univers_sync_catalog_event', 'univers_sync_catalog'); function univers_sync_catalog() { // здесь синхронизация, запросы к БД, обновление товаров }
Внутри
univers_sync_catalog()не выводите HTML и не делайтеdie(). Фоновая функция должна логировать результат: сколько строк обработано, какие ошибки, когда был последний запуск.Важный момент: WP-Cron запускается при посещениях сайта. Если посещений мало, задача может выполняться не строго каждые 15 минут. Для стабильной работы лучше отключить встроенный cron и вызвать его системным cron на хостинге:
define('DISABLE_WP_CRON', true);
*/15 * * * * wget -q -O - https://site.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1
И ещё: прямое подключение к другой базе через логин/пароль в коде плагина опасно. Данные подключения лучше хранить в настройках WordPress или env, а сам импорт делать порциями, чтобы не упереться в timeout.