Как создать таблицу всех товаров Woocomerce, вывести ее через шорткод на своем сайте, а также вывести ее на другом сайте через скрипт.
Сложная задача, которая оказалась посильной chat.qwen.ai 2.5
1. В общем для начала создаем таблицу и шорткод на основном сайте.
Всё очень сложно объяснять, поэтому более подробно можно обсудить в комментариях
// 2 таблицы выводим на других сайтах
//
add_action('rest_api_init', function () {
// Endpoint для первой таблицы
register_rest_route('custom/v1', '/table-html-1/', array(
'methods' => 'GET',
'callback' => 'get_table_html_1',
));
// Endpoint для второй таблицы
register_rest_route('custom/v1', '/table-html-2/', array(
'methods' => 'GET',
'callback' => 'get_table_html_2',
));
});
// Функция для получения HTML первой таблицы
function get_table_html_1() {
// ID страницы с первой таблицей (замените на реальный ID)
$page_id = 52084; // Укажите ID страницы с первой таблицей
// Получаем содержимое страницы
$page_content = get_post_field('post_content', $page_id);
// Применяем фильтры WordPress для обработки шорткодов и других элементов
$page_content = apply_filters('the_content', $page_content);
// Ищем HTML-код таблицы
if (preg_match('/<table.*?>.*?<\/table>/is', $page_content, $matches)) {
return rest_ensure_response($matches[0]); // Возвращаем только таблицу
}
return rest_ensure_response('<p>Таблица 1 не найдена.</p>');
}
// Функция для получения HTML второй таблицы
function get_table_html_2() {
// ID страницы со второй таблицей (замените на реальный ID)
$page_id = 52087; // Укажите ID страницы со второй таблицей
// Получаем содержимое страницы
$page_content = get_post_field('post_content', $page_id);
// Применяем фильтры WordPress для обработки шорткодов и других элементов
$page_content = apply_filters('the_content', $page_content);
// Ищем HTML-код таблицы
if (preg_match('/<table.*?>.*?<\/table>/is', $page_content, $matches)) {
return rest_ensure_response($matches[0]); // Возвращаем только таблицу
}
return rest_ensure_response('<p>Таблица 2 не найдена.</p>');
}
// 2 таблицы выводим на других сайтах
// Таблицы и сортировка товаров сайтов с доменои и без для сторонних сайтов
// Функция для вывода таблицы товаров
function display_products_table($atts) {
// Получаем атрибуты шорткода (например, category="slug")
$atts = shortcode_atts(array(
'category' => '', // Слаг категории по умолчанию
), $atts, 'products_table');
// Параметры запроса
$args = array(
'post_type' => 'product', // Только товары WooCommerce
'posts_per_page' => -1, // Все товары
'post_status' => 'publish', // Только опубликованные товары
'tax_query' => array(
array(
'taxonomy' => 'pa_thematics', // Таксономия "Тематика"
'operator' => 'EXISTS', // Товары с назначенной таксономией
),
),
);
// Если указана категория, добавляем фильтр по категории
if (!empty($atts['category'])) {
$args['tax_query'][] = array(
'taxonomy' => 'product_cat', // Категории WooCommerce
'field' => 'slug', // Используем слаг категории
'terms' => $atts['category'], // Указанный слаг категории
);
}
// Выполняем запрос
$products = new WP_Query($args);
// Если товары найдены
if ($products->have_posts()) {
ob_start(); // Начинаем буферизацию вывода
echo '<table style="width: 100%; border-collapse: collapse;">';
echo '<tr>
<th>Название товара</th>
<th>Цена</th>
<th>Ссылка на сайт</th>
<th>Тематика (А-Я)<span class="pulse"> Сортировка по тематике от А до Я</sapn></th>
</tr>';
while ($products->have_posts()) {
$products->the_post();
global $product;
// Получаем данные товара
$product_id = get_the_ID();
$title = get_the_title(); // Название товара
$price = $product->get_price_html(); // Цена
$short_description = apply_filters('the_content', $product->get_short_description()); // Краткое описание
// Получаем значение атрибута "Тематика"
$tematika = '';
$taxonomy = 'pa_thematics'; // Слаг таксономии для атрибута "Тематика"
// Проверяем, существует ли таксономия
if (taxonomy_exists($taxonomy)) {
$tematika_terms = wp_get_post_terms($product_id, $taxonomy);
if (!empty($tematika_terms) && !is_wp_error($tematika_terms)) {
$tematika = $tematika_terms[0]->name; // Берем первое значение атрибута
} else {
$tematika = 'Значение не найдено'; // Отладочное сообщение
}
} else {
$tematika = 'Таксономия не существует'; // Отладочное сообщение
}
// Выводим строку таблицы
echo '<tr>';
echo '<td>' . esc_html($title) . '</td>';
echo '<td>' . $price . '</td>';
echo '<td>' . $short_description . '</td>';
echo '<td>' . esc_html($tematika) . '</td>';
echo '</tr>';
}
echo '</table>';
wp_reset_postdata(); // Сброс цикла
return ob_get_clean(); // Возвращаем буферизованный вывод
} else {
return '<p>Товаров не найдено.</p>';
}
}
// Регистрация шорткода
add_shortcode('products_table', 'display_products_table');
// Подключение JavaScript для сортировки таблицы
function enqueue_sort_script() {
?>
<script>
document.addEventListener("DOMContentLoaded", function () {
const table = document.querySelector("table");
if (!table) return; // Если таблица не найдена, завершаем выполнение
const rows = Array.from(table.querySelectorAll("tr:nth-child(n+2)")); // Все строки таблицы, кроме заголовка
// Сортировка строк по столбцу "Тематика" (четвертый столбец)
rows.sort((a, b) => {
const aText = a.children[3].innerText.trim().toLowerCase(); // Значение из столбца "Тематика"
const bText = b.children[3].innerText.trim().toLowerCase();
return aText.localeCompare(bText); // Сравнение строк
});
// Добавляем отсортированные строки обратно в таблицу
const tbody = table.querySelector("tbody");
if (tbody) {
rows.forEach(row => tbody.appendChild(row));
}
});
</script>
<?php
}
add_action('wp_footer', 'enqueue_sort_script');
// Таблицы и сортировка товаров сайтов с доменом и без для сторонних сайтов
2. На сайте поддомене (другом URL) для вывода таблицы добавляем:
<div class="content">
<div id="table-container">Загрузка данных...</div>
<script>
document.addEventListener("DOMContentLoaded", function () {
// Функция для сортировки таблицы
function sortTable() {
const table = document.querySelector("table");
if (!table) return;
const rows = Array.from(table.querySelectorAll("tr:nth-child(n+2)"));
rows.sort((a, b) => {
const aText = a.children[3].innerText.trim().toLowerCase();
const bText = b.children[3].innerText.trim().toLowerCase();
return aText.localeCompare(bText);
});
const tbody = table.querySelector("tbody");
if (tbody) {
rows.forEach(row => tbody.appendChild(row));
}
}
// Отслеживание изменений в DOM
const observer = new MutationObserver(function (mutations) {
mutations.forEach(function (mutation) {
if (document.querySelector("table")) {
sortTable(); // Запускаем сортировку, если таблица найдена
observer.disconnect(); // Останавливаем наблюдение
}
});
});
// Начинаем наблюдение за изменениями в DOM
observer.observe(document.body, { childList: true, subtree: true });
});
</script>
<script>
// URL REST API
const apiUrl = 'https://zaplata.ru/wp-json/custom/v1/table-html-2/';
// Функция для получения данных
async function fetchTableHtml() {
try {
const response = await fetch(apiUrl, { method: 'GET' });
if (!response.ok) {
throw new Error(`Ошибка HTTP: ${response.status}`);
}
// Получаем данные как JSON
const data = await response.json();
// Вставляем HTML-код таблицы на страницу
document.getElementById('table-container').innerHTML = data || '<p>Таблица не найдена.</p>';
} catch (error) {
document.getElementById('table-container').innerHTML = `<p>Ошибка: ${error.message}</p>`;
}
}
// Вызываем функцию при загрузке страницы
fetchTableHtml();
</script>
</div>