从子页面获取子字段并按字母顺序对它们进行排序

时间:2014-04-30 11:39:09

标签: php wordpress sorting html-lists alphabetical

我使用php代码显示特定父页面ID中的子页面,以显示选择列表类型中的页面链接。

我的所有子页面都有一个名为" artiste"的子字段,带有艺术家名称。

这是我的PHP代码,用于显示带有页面链接的页面名称:

<?php

        $args = array(
        'post_type'      => 'page',
        'posts_per_page' => -1,
        'post_parent'    => '22',
        'order'          => 'ASC',
        'orderby'        => 'title'
        );

        $parent = new WP_Query( $args );

        if ( $parent->have_posts() ) : ?>

        <div class="styled-select">

            <select name="" onchange="location = this.options[this.selectedIndex].value;">

            <?php while ( $parent->have_posts() ) : $parent->the_post(); ?>



                    <option value="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title(); ?></option>



            <?php endwhile; ?>

            </select>

        </div>

        <?php endif; wp_reset_query(); ?>

这很好用,我得到所有子页面标题和固定链接并按字母顺序排序。

现在我想获取页面标题,而不是每个子页面的自定义字段,这是我的代码: 我的自定义字段是&#34; the_sub_field(&#39; nom_artiste&#39;);&#34;     

        $args = array(
        'post_type'      => 'page',
        'posts_per_page' => -1,
        'post_parent'    => '22',
        'order'          => 'ASC',
        'orderby'        => 'title'
        );

        $parent = new WP_Query( $args );

        if ( $parent->have_posts() ) : ?>

        <div class="styled-select">

            <select name="" onchange="location = this.options[this.selectedIndex].value;">

            <option>--- A - Z ---</option>



            <?php while ( $parent->have_posts() ) : $parent->the_post(); ?>



                    <option value="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php if(get_field('artiste')): while (has_sub_field('artiste') ): ?><?php the_sub_field('nom_artiste'); ?><?php endwhile; endif; ?></option>



            <?php endwhile; ?>


            </select>

        </div>

        <?php endif; wp_reset_query(); ?>

它也有效,我得到自定义字段而不是页面标题,以及我的页面标题的永久链接,这是完美的。

但是在第二个代码中,我的自定义字段根据页面标题进行排序。

例如,我有2页:

AAAAA

ZZZZZ

和自定义字段:

表示AAAA:自定义字段为GGGG

表示ZZZZ:自定义字段为BBBB

所以使用第二个PHP代码,我的列表没有正确排序,因为它排序取决于页面标题而不是自定义字段...我得到:

GGGG

BBBB

我认为我必须使用我的自定义字段创建一个数组,以便在我的select onchange中显示它们之前按字母顺序对它们进行排序,但我不知道该怎么做...

任何人都可以帮我这个吗?

非常感谢你的帮助

1 个答案:

答案 0 :(得分:0)

尝试此操作,替换代码中<?php while ... endwhile; ?>之间的所有内容:

<?php
   //Declare an array to hold data
   $options = array();

   //The loop
   while ( $parent->have_posts() ) : $parent->the_post();
       //Define a temporary array
       $option = array();

       //Get all the values we need and store them in an array.
       $option['value'] = get_permalink();
       $option['title'] = get_the_title();
       if(get_field('artiste')): 
           while (has_sub_field('artiste') ) {
              $option['label'] = get_sub_field('nom_artiste'); 
           }
       else: 
           $option['label'] = get_the_title(); //Put something here if artiste is not populated.
       endif;
       $options[] = $option;
    endwhile;

    //Sort the array on the 'label' field
    usort($options, function($a, $b) { return strcmp($a['label'], $b['label']); });

    //Output the <option> tags
    $format = '          <option value="%s" title="%s">%s</option>'."\n";
    foreach ($options as $o) {
         printf($format, $o['value'], $o['title'], $o['label']);
    }
?>