WordPress получает только уникальные значения пользовательских полей

#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 .

Здесь все работает нормально.