Вопрос или проблема
Я не эксперт в PHP и пытаюсь применить условное форматирование к данным, полученным из wpdb. Честно говоря, я пытаюсь создать шорткод для этого. Мой девиз — получить значения для $previous_marks и $current_marks из базы данных и изменить цвет $current_marks в зависимости от условия if, else. Согласно условию:
- Если $current_marks больше $previous_marks, то значение $current_marks должно отображаться зеленым цветом вместе с изображением pass.png рядом со значением.
- В противном случае значение $current_marks должно отображаться красным цветом вместе с изображением fail.png рядом со значением.
Мне также нужна помощь в отображении изображений рядом со значением $current_marks, у меня нет кода для этого:
Вот как выглядит мой код:
add_shortcode( 'marks_col', function () {
$subject = $_GET['subject'];
global $wpdb;
$previous_marks = $wpdb->get_results( "SELECT prev FROM grade WHERE sub='" .$subject. "'");
$current_marks = $wpdb->get_results( "SELECT current FROM grade WHERE sub='" .$subject. "'");
if ($previous_marks < $current_marks) {
echo "<p style="color:green">" .$current_marks. "</p>"; ##отобразить pass.png рядом со значением $current_marks
} else {
echo "<p style="color:red">" .$current_marks. "</p>"; ##отобразить fail.png рядом со значением $current_marks
}
} );
$subject извлекается из URL сайта: www.domain.com/results?subject=biology. В настоящее время, при использовании шорткода [marks_col] в установке WP, он просто выводит ‘Array’ красным цветом и ничего больше. Любая помощь будет очень признательна.
Сначала несколько заметок:
- Шорткоды принимают аргументы, так что вы можете написать [marks subject=”Biology”] (@см. https://codex.wordpress.org/Shortcode_API)
- Вы никогда не должны передавать необработанные данные напрямую в SQL-запрос, WordPress использует PDO, это означает, что вы можете подготавливать запросы. (@см. https://developer.wordpress.org/reference/classes/wpdb/prepare/)
- Использование get_results вернет массив, объект или null (@см. https://developer.wordpress.org/reference/classes/wpdb/get_results/). Есть много подходов. Вы можете использовать $wpdb->get_var(), чтобы получить одно значение. Или $wpdb->get_results(), чтобы получить оба значения в одном запросе. Я думаю, что мы упускаем некоторые данные, если вам нужна конкретная строка только для одного пользователя, вы также можете использовать $wpdb->get_row(). Представьте, что база данных — это лист Excel. Если вам нужно несколько строк и столбцов, вы хотите использовать $wpdb->get_results(). Если вам нужна только одна конкретная строка, вы можете использовать $wpdb->get_row(). Если вам нужен только один столбец данных, используйте $wpdb->get_column(). Если вам нужна только одна конкретная ячейка, используйте $wpdb->get_var().
- Я бы выбрал подход с иконками вместо подхода с изображениями, если вы просто хотите использовать “галочку” или какой-то “восклицательный” знак в зависимости от провала или прохождения конкретного результата. Бесплатная и хорошая библиотека иконок (@см. https://fontawesome.com/)
Код, основанный на вашем вопросе, хотя я думаю, что вам не хватает оператора WHERE в вашем запросе, чтобы извлечь ‘marks’ конкретного человека на основе собственных проектов.
add_shortcode( "marks", function( $atts ) {
//= значения по умолчанию
$args = shortcode_atts( array(
'subject' => 'biology',
), $atts );
//= запрос к базе данных
global $wpdb;
$query = $wpdb->prepare( "SELECT prev, current FROM grade WHERE sub = %s", $args['subject'] );
$result = $wpdb->get_row( $query );
//= выход, если нет результатов
if( is_null( $result ) ) return;
//= условие
if( $result[ 'prev' ] < $result[ 'current' ] ) {
echo "<p color=\"color: green;\">{$result['current']}<i class=\"far fa-check\"></i></p>";
} else {
echo "<p color=\"color: red;\">{$result['current']}<i class=\"far fa-times\"></i></p>";
}
} );
Если необходимо, вы можете легко отладить объекты и массивы на экране с помощью следующего кода:
echo var_export( $array, true );
Надеюсь, это поможет!
Я не совсем понимаю, но вы хотите получить доступ к данным на основе “предмета”, который я предполагаю является “User_ID” или чем-то в этом роде. А также передать параметр “столбец”. Так вы могли бы запросить одно из следующих вещей с помощью одного шорткода.
- Получить имя на основе предмета
- Получить посещаемость на основе предмета
- Получить prev на основе предмета
- Получить current на основе предмета
Если это так, нам действительно нужно изменить код.
Ответ или решение
Чтобы применить условное форматирование к данным, полученным из базы данных MySQL с помощью wpdb
в WordPress, необходимо создать шорткод, который будет осуществлять выборку оценок и визуально применять стили в зависимости от условий. Ниже представлено развернутое решение вашей задачи.
Шаг 1: Создание шорткода
Вы начнете с добавления шорткода в ваш файл functions.php
темы или в специальный плагин. Рассмотрим следующую реализацию шорткода, который принимает параметр subject
.
add_shortcode("marks", function($atts) {
// Задаем значения по умолчанию
$args = shortcode_atts(array(
'subject' => 'biology',
), $atts);
global $wpdb;
// Подготавливаем SQL-запрос для безопасной выборки данных
$query = $wpdb->prepare("SELECT prev, current FROM grade WHERE sub = %s", $args['subject']);
$result = $wpdb->get_row($query);
// Проверяем, есть ли результаты
if (is_null($result)) return '<p>Нет данных для данного предмета.</p>';
// Применяем условное форматирование
if ($result->prev < $result->current) {
$color = "green";
$icon = '<img src="path/to/pass.png" alt="Pass" />';
} else {
$color = "red";
$icon = '<img src="path/to/fail.png" alt="Fail" />';
}
// Возвращаем стилизованный вывод
return "<p style='color: {$color};'>{$result->current} {$icon}</p>";
});
Шаг 2: Пояснение кода
-
Получение атрибутов шорткода: Используется функция
shortcode_atts()
, чтобы установить значение по умолчанию для атрибутаsubject
, если он не передан. -
Запрос к базе данных: С помощью метода
prepare()
из классаwpdb
мы формируем и выполняем SQL-запрос. Методget_row()
возвращает одну строку с оценками по указанному предмету. -
Проверка результата: Если данные не найдены, возвращаем сообщение пользователю.
-
Условное форматирование: Условия проверяют, превышает ли
current
значениеprev
. В зависимости от этого устанавливается цвет текста и соответствующая иконка. -
Возврат результата: С помощью
return
мы выводим стилизованный элементp
с цветом и иконкой рядом с текущими оценками.
Шаг 3: Использование шорткода
Теперь вы можете использовать этот шорткод на страницах или в записях WordPress, добавляя следующий текст:
[marks subject="biology"]
Шаг 4: Рекомендации по улучшению
- Безопасность: Использование методов подготовки запросов минимизирует риск SQL-инъекций.
- Иконки: Вместо использования изображений можно рассмотреть возможность внедрения иконок из библиотек, таких как Font Awesome, что значительно упростит задачу.
- Кэширование: При частом обращении к базе данных рассмотреть использование кэширования для повышения эффективности.
Это решение предоставляет полноценный функционал и гибкость для отображения оценок с условным форматированием. Надеюсь, предложенные шаги будут полезны в реализации вашего проекта.