按自定义字段选择分组

Optgroup by custom field

我目前正在使用 Wordpress 创建一个 <select> 并填充 <option>

<?php if( $lh_loop->have_posts() ): ?>
  <select class="mousechoice left">

    <?php while( $lh_loop->have_posts() ) : $lh_loop->the_post();?>
      <optgroup label="<?php echo get_field("company_name") ?>">
        <option data-id="<?php echo $post->post_name; ?>"><?php the_title(); ?></option>
      </optgroup>
    <?php endwhile; ?>

  </select>
<?php endif; ?>

显示的是:

<select class="mousechoice left">

  <optgroup label="SteelSeries">
    <option data-id="sensei">Sensei</option>
  </optgroup>
  <optgroup label="Razer">
    <option data-id="deathadder">Deathadder</option>
  </optgroup>
  <optgroup label="SteelSeries">
    <option data-id="kana">Kana</option>
  </optgroup>

</select>

我想要一种将具有相同公司名称的 post 分组到 <optgroup> 中的方法。这将导致:

<select class="mousechoice left">

  <optgroup label="SteelSeries">
    <option data-id="sensei">Sensei</option>
    <option data-id="kana">Kana</option>
  </optgroup>
  <optgroup label="Razer">
    <option data-id="deathadder">Deathadder</option>
  </optgroup>

</select>

我曾尝试将当前 post 的公司与之前 post 的公司进行比较,但意识到具有相同公司名称的 post 可能在另一个公司之后或之前post 使用不同的公司名称。

我知道我也可以使用 if 语句来指定每个公司名称,但我想要一个允许其他公司名称尚未输入到 Wordpress 中的解决方案。

如果您想按特定值对数组的所有元素进行分组,我喜欢先遍历数组以整理它,然后在单独的循环中进行显示。

所以我会把每个元素放入一个数组中,该数组具有我想作为键分组的值。

所以我想创建一个数组,看起来像

 ['company A' =>[ [1 => 'option 1'],
                  [2 => 'option 2'],
                  ...
                ],
  'company B' =>[ [1 => 'option 3'],
                  [2 => 'option 4'],
                  ...
                 ],
   ...
  ]

要创建此数组,您可以使用类似(未测试)

$grouped = array();
while( $lh_loop->have_posts() ) : 
     $lh_loop->the_post();
     $key = get_field("company_name") 
     $subkey = $post->post_name; 
     $display = the_title();   
     if (empty($grouped[$key]){ //if they key isn't set yet
         //add the key to the array as a new element
         $grouped[] = array($key=>array($subkey=>$title));  
     }else{
         //else add to existing key
         $grouped[$key][] = array($subkey=>$title); 
     }         
endwhile;

然后,要显示列表,请执行类似

的操作
foreach ($grouped as $comp => $group){
    echo "<optgroup label=\"$comp\">";
     foreach ($group as $key => $val){
          echo "<option data-id=\"$key\">$val</option>";
     }
     echo "</optgroup>";
}