Вопрос или проблема
Я отображаю набор предстоящих матчей для двух крикетных команд на одной странице. Матчи создаются из пользовательского типа записи (CPT), и соответствующая команда выбирается из пользовательского поля.
У меня всё работает так, как я хотел, но у меня настроены пользовательские циклы, и единственное отличие между двумя заключается в одной паре ключ => значение.
$firstXIFixtures = new WP_Query(array(
'posts_per_page' => -1,
'post_type' => 'fixture',
'orderby' => 'meta_value_num',
'meta_key' => 'date',
'order' => 'ASC',
'meta_query' => array(
array(
'key' => 'team',
'compare' => '==',
'value' => '1st_XI',
'type' => 'text'
),
),
));
Мне нужно только изменить 'value' => '1st_XI'
на 'value' => '2nd_XI'
в следующем цикле.
Если это поможет понять контекст, матчи находятся в макете с двумя колонками с отдельными заголовками сверху, чтобы указать, для каких команд предназначены следующие матчи.
Как я могу сделать этот файл шаблона немного чище, так как он кажется довольно повторяющимся?
Спасибо,
Крейг
Ответ или решение
Чтобы избежать повторения кода в вашем шаблонном файле WordPress, когда единственное различие между двумя пользовательскими циклами — это одна пара ключ-значение в meta_query
, вы можете воспользоваться функцией PHP. Это не только сделает ваш код более чистым и простым для чтения, но и облегчит дальнейшие изменения или обновления.
Вот пример того, как это можно реализовать:
function get_fixtures_by_team($team_value) {
return new WP_Query(array(
'posts_per_page' => -1,
'post_type' => 'fixture',
'orderby' => 'meta_value_num',
'meta_key' => 'date',
'order' => 'ASC',
'meta_query' => array(
array(
'key' => 'team',
'compare' => '==',
'value' => $team_value,
'type' => 'text'
),
),
));
}
$firstXIFixtures = get_fixtures_by_team('1st_XI');
$secondXIFixtures = get_fixtures_by_team('2nd_XI');
Объяснение решения:
-
Создание функции: Мы создаем функцию
get_fixtures_by_team
, которая принимает один параметр — значение команды ($team_value
). Это позволяет нам динамически использовать различные значения для выборки нужных постов, не дублируя код. -
Использование WP_Query: Внутри функции мы создаем объект
WP_Query
, который делает именно то, что и ваш первоначальный код; однако теперь он принимает различное значение для команды в зависимости от переданного аргумента. -
Вызов функции: Мы вызываем эту функцию дважды: один раз для первой команды (
1st_XI
) и один раз для второй команды (2nd_XI
). Каждое обращение к функции возвращает результаты в переменные$firstXIFixtures
и$secondXIFixtures
.
Преимущества:
-
Читаемость: Данный подход значительно улучшает читаемость кода. Вместо того чтобы видеть два почти идентичных блока кода, теперь у вас есть простой вызов функции с параметрами.
-
Легкость обновления: Если вам когда-либо понадобиться изменить параметры запроса, вам нужно будет сделать это только в одном месте, что значительно снижет вероятность ошибок.
-
Переиспользуемость: Теперь вы можете легко переиспользовать функцию для других команд или в других частях вашего шаблона, просто передав нужное значение.
Заключение
Реализация функции для повторяющихся циклов — это хороший пример применения принципов DRY (Don’t Repeat Yourself) в программировании. Это поможет вам поддерживать код чистым и управляемым, что, в свою очередь, улучшит его качество и масштабируемость в будущем. Не забывайте также о проверках: убедитесь, что функция корректно обрабатывает случаи, когда нет результатов по запросу.
Если у вас остались вопросы или необходимость в дополнительных пояснениях, не стесняйтесь обращаться!