Разобраться почему не срабатывает код, wordpress
логика должна быть такой:
Получение рубрики записи: Вам нужно определить рубрику (или таксономию) для типа записей price, где будет использоваться ваш шорткод. Это позволит вам в дальнейшем фильтровать записи по этой рубрике. Получение списка записей по рубрике с заполненным ACF полем link_price: Далее, нужно получить все записи из этой рубрики, где заполнено поле Advanced Custom Fields (ACF) link_price. Это означает, что вы будете выполнять запросы к базе данных или использовать функции WordPress для поиска записей, которые соответствуют этим критериям. Формирование цен для таблицы: Необходимо создать два варианта формирования цен для таблицы, в зависимости от количества доступных данных по ценам на металлы: Если по каждому металлу отдельно есть более 5 записей с ценой за последние 30 дней (из полученных ранее записей), то цена формируется на основе этих данных. Если по металлу менее 5 цен за последние 30 дней, то цены в таблице формируются на основе всех доступных данных по ценам за последние 30 дней, без фильтрации по записям.
функция scrap_metal_prices_shortcode($atts) {
global $wpdb;
$attributes = shortcode_atts([
'metal' => '',
], $atts);
$metals = explode(',', $attributes['metal']);
$post_id = get_the_ID();
$categories = wp_get_post_terms($post_id, 'category');
if (!empty($categories) && !is_wp_error($categories)) {
$category_id = $categories[0]->term_id;
}
$posts_with_prices = get_posts([
'post_type' => 'price',
'category' => $category_id,
'meta_query' => [
[
'key' => 'link_price',
'compare' => '!=',
'value' => ''
]
],
'fields' => 'ids'
]);
$valid_post_ids = implode(',', array_map('intval', $posts_with_prices));
$metal_prices_data = [];
foreach ($metals as $metal) {
$query = $wpdb->prepare("
SELECT COUNT(p.id) AS count, tm.metal_name
FROM {$wpdb->prefix}types_of_metal tm
LEFT JOIN {$wpdb->prefix}prices p ON tm.metal_id = p.metal_id AND p.post_id IN ($valid_post_ids)
WHERE tm.metal_name = %s AND p.date >= CURDATE() - INTERVAL 30 DAY
GROUP BY tm.metal_name
", $metal);
$result = $wpdb->get_row($query);
if ($result && $result->count >= 1) {
$metal_prices_data[$metal] = 'use_specific_posts';
} else {
$metal_prices_data[$metal] = 'use_all_posts';
}
}
// Выполняем запрос к базе данных для получения цен по указанной логике
$prices_output = []; // Массив для хранения результатов
foreach ($metal_prices_data as $metal => $data_source) {
if ($data_source === 'use_specific_posts') {
$query = $wpdb->prepare("
SELECT tm.metal_name, MAX(p.date) AS last_update,
AVG(p.value) AS average_price,
MAX(p.value) AS high_price,
MIN(p.value) AS low_price
FROM {$wpdb->prefix}types_of_metal tm
LEFT JOIN {$wpdb->prefix}prices p ON tm.metal_id = p.metal_id
WHERE tm.metal_name = %s AND p.post_id IN ($valid_post_ids) AND p.date >= CURDATE() - INTERVAL 30 DAY
GROUP BY tm.metal_name
", $metal);
} else {
$query = $wpdb->prepare("
SELECT tm.metal_name, MAX(p.date) AS last_update,
AVG(p.value) AS average_price,
MAX(p.value) AS high_price,
MIN(p.value) AS low_price
FROM {$wpdb->prefix}types_of_metal tm
LEFT JOIN {$wpdb->prefix}prices p ON tm.metal_id = p.metal_id
WHERE tm.metal_name = %s AND p.date >= CURDATE() - INTERVAL 30 DAY
GROUP BY tm.metal_name
", $metal);
}
$prices_output[$metal] = $wpdb->get_row($query);
}
// Начало таблицы
$output = '
Название металла
Самая высокая цена
Средняя цена
Самая низкая цена
Дата обновления
Цена указана в грн за 1 кг
';
// Массив с украинскими названиями месяцев
$ukrMonths = [
1 => 'січ', 2 => 'лют', 3 => 'бер', 4 => 'кві', 5 => 'тра', 6 => 'чер',
7 => 'лип', 8 => 'сер', 9 => 'вер', 10 => 'жов', 11 => 'лис', 12 => 'гру'
];
// Вывод результатов в таблицу
foreach ($prices_output as $metal => $row) {
if ($row) {
// Получение номера месяца из даты
$monthNum = date('n', strtotime($row->last_update));
// Замена английского названия месяца на украинское
$ukrMonth = $ukrMonths[$monthNum];
// Форматирование даты
$formattedDate = date('d ', strtotime($row->last_update)) . $ukrMonth . date(' Y', strtotime($row->last_update));
$output .= sprintf(
'%s%.2f грн%.2f грн%.2f грн%s',
esc_html($metal), // Название металла
$row->high_price, // Высокая цена
$row->average_price, // Средняя цена
$row->low_price, // Низкая цена
$formattedDate // Дата обновления
);
}
}
// Конец таблицы
$output .= '';
return $output; // Возвращаем готовую таблицу
}
// Добавляем шорткод
add_shortcode('scrap_metal_prices', 'scrap_metal_prices_shortcode');
Актуальные фриланс-проекты в категории PHP
Нужна интеграция KeyCRM → ПРРО Кашалот |
Разработка 2 SEO-ориентированных сайтов по продаже запчастей (квадроциклы и спецтехника)Разработка двух специализированных сайтов по продаже запчастейОбщая информация Необходимо разработать два специализированных сайта: Запчасти для квадроциклов, UTV, SSV и другой подобной техники. Запчасти для специальной техники. Существующий сайт компании:… PHP, Веб-программирование ∙ 3 дня 22 часа назад ∙ 77 ставок |
Разработка веб-сайта WordPress
1002 UAH
|
Парсер expireddomains.net
5000 UAH
Нужен парсер expireddomains.net на сайте нужно сначала залогиниться, проблема в том что блокирует ИП при попытке парсить данные, нужно парсить тематические домены по списку ключевых слов, кто не уверен в своих силах не пишите PHP, Веб-программирование ∙ 8 дней 22 часа назад ∙ 52 ставки |
Интеграция платежного сервиса с Sales Force
3116 UAH
На сайте стоит виджет платежной системы, его нужно интегрировать с asles fоrce что бы все требуемые параметры видели на стороне salec force Нужно сдлеать так, что бы все платежи и подписки кнтролировались через salecforec PHP, Веб-программирование ∙ 9 дней 1 час назад ∙ 44 ставки |