#wordpress #custom-fields
#wordpress #пользовательские поля
Вопрос:
Я работаю над сайтом WordPress, который отображает ряд проектов, хранящихся в пользовательских типах записей. Каждое пользовательское сообщение включает в себя два пользовательских поля (среди прочих) «Название проекта» и «Цвет проекта». Может быть несколько пользовательских сообщений о конкретном «названии проекта».
Я хочу создать легенду (ключ) для всех проектов, в которой перечислены «Названия проектов» и «Цвета проекта», взятые из значений пользовательских полей выше.
Итак, например, у меня есть 3 проекта под названием «Бананы», цвет которых «Желтый», 6 проектов под названием «Апельсины», цвет которых «оранжевый», и 4 проекта под названием «Яблоки», цвет которых «зеленый». В моей легенде (ключ) должен отображаться один банан желтого цвета, один апельсин оранжевого цвета и одно яблоко зеленого цвета.
Конечно, если я использую цикл, он отображает 3 банана, 6 апельсинов и 4 яблока. Как я могу отобразить только список названий проектов и цветов проекта?
Я рассмотрел три метода: пользовательскую таксономию, проверку на наличие дубликатов в массиве и использование GROUP BY
в качестве фильтра на posts_groupby
.
GROUP BY
кажется, это правильный путь, но я не могу заставить его что-либо делать. Самое большее, что я получил, это поместить это в мой functions.php …
function sort_legend ( $groupby ) {
global $wpdb;
$groupby .= "{$wpdb->postmeta}.meta_key = 'Color' ";
return $groupby;
}
… и применяю его в качестве фильтра вокруг моего объекта запроса…
<?php add_filter('posts_groupby', 'sort_legend'); ?>
<?php if ( $myQuery->have_posts() ) while ($myQuery->have_posts() ) : $myQuery->the_post(); ?>
<?php remove_filter('posts_groupby', 'sort_legend'); ?>
…но у меня все еще есть несколько записей.
Ответ №1:
Вот мое рабочее решение…
Удалите пользовательские поля «Цвета проекта» и «Названия проекта» из пользовательского шаблона (вздох), зарегистрируйте пользовательскую таксономию под названием «Классы проекта» и присвоите вновь зарегистрированной таксономии пользовательский тип записи, смотрите здесь. В интерфейсе WordPress присвоите каждому пользовательскому сообщению соответствующий «Класс проекта» бананы, яблоки и т.д., Что снова объясняется по ссылке выше.
Однако по-прежнему существует проблема с отображением цветового ключа для каждой пользовательской записи таксономии. Я повторно использовал имена классов проекта в качестве имен таблиц стилей, чтобы я мог присвоить каждому названию стиля цвет фона. Однако в именах реальных классов проекта есть заглавные буквы и пробелы, которые необходимо удалить, чтобы сделать их удобными для таблицы стилей.
Добавьте функцию php rename_projects
в functions.php это исправляет пробелы и заглавные буквы в названии таксономии «Класс проекта» и делает его подходящим для названия стиля css, которое я использовал…
// Rename Projects custom field for css styles
function rename_projects($sProjectName) {
$sFind = ' ';
$sReplace = '-';
$sAmended = mb_strtolower(str_replace( $sFind, $sReplace, $sProjectName ));
return $sAmended;
}
Теперь вы можете использовать имена классов вашего проекта в качестве имен таблиц стилей.
Далее, в шаблоне вашей страницы отобразите свою пользовательскую таксономию таким образом…
<?php
$args=array(
'taxonomy' => 'projectclass',
'orderby' => 'name',
'order' => 'ASC'
);
$categories=get_categories($args);
foreach($categories as $category) {
$sColorName = rename_projects($category->name); // To lower case and replace spaces
echo '<div class="legend-color ' . $sColorName . '"></div> // Color style name
<div class="legend-project">' . $category->name . '</div>'; // Taxonomy name
}
?>
Итак, теперь, например, $category->name
«Мой первый проект» имеет соответствующее название таблицы стилей, my-first-project
которое вы можете добавить в свою таблицу стилей и стиль. Обратите внимание, что в <div class="legend-color '
я добавляю название стиля к существующему классу, так что результирующий класс будет «legend-color my-first-project»: т.е. два стиля. Жестко запрограммированный класс «legend-color» содержит все атрибуты стиля, кроме цвета фона, который находится в $sColorName
.
Здесь все работает нормально.