为了账号安全,请及时绑定邮箱和手机立即绑定

Wordpress 结果中自定义帖子类型的按字母顺序过滤

Wordpress 结果中自定义帖子类型的按字母顺序过滤

PHP
慕桂英546537 2023-12-15 15:51:15
我正在处理自定义帖子类型存档,我想添加 A-Z 过滤菜单。 我设法按照这个线程(Create letterical Pagination in wordpress)让它正常工作,但我不明白我的初始页面(/exposants)如何显示所有结果。<div class="exposant__filter" id="exposants">        <a href="/exposants/#exposants"><?php _e('Tout', 'festival'); ?></a>    <?php         $posts = get_posts(array(            'numberposts' => -1,            'post_type' => 'exposant',            'orderby' => 'title',            'order' => 'ASC',        ));                 $firstLetters = array();        foreach($posts as $post) {            $title = $post->post_title;            $startingLetter = substr($title, 0, 1);            $dupeFirstLetters[] = $startingLetter;            $firstLetters = array_unique($dupeFirstLetters);            sort($firstLetters);        }        foreach($firstLetters as $letter) {            echo "<a href=\"?lettre=$letter\">$letter</a>";        }        if(!empty($_GET['lettre'])) {                $letter = $_GET['lettre'];        }        else {            $letter = $firstLetters[0];        } ?>    </div>          <?php    $exposantsArchive = new WP_Query(array(        'posts_per_page' => -1,        'post_type' => 'exposant',        'orderby' => 'title',        'order' => 'ASC',    )); ?>    <div class="row row--2col u-m-top--8">        <?php           while($exposantsArchive->have_posts()) {            $exposantsArchive->the_post();                         $first_letter = strtoupper(substr(apply_filters('the_title',$post->post_title),0,1));                        $logo = get_field('logo');                        if($first_letter == strtoupper($letter)) { ?>            <div class="exposant__thumb col--padding-right">                <div class="exposant__logo">                    <img src="<?php echo $logo['url'] ?>" alt="<?php echo $logo['alt'] ?>">                </div>我想我必须替换 else {$letter = $firstLetters[0];} 但我不知道用什么替换。预先感谢您的宝贵支持。
查看完整描述

1 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

如果我正确理解了问题,这里是您的代码的稍微优化的版本。为了清楚起见,我冒昧地尽可能地将你的 php 和 html 解耦。


它没有经过测试,可能需要一些调整,但总的来说我希望这能成功!


在您的functions.php文件中,添加以下内容,这将允许您按首字母过滤数据库查询:


add_filter( 'posts_where', 'tomtom_posts_where', 10, 2 );

function tomtom_posts_where( $args, $wp_query_obj )

{

    global $wpdb;

    $starts_with = $wp_query->get( 'starts_with' )

    if ( $starts_with ) {

        $args .= ' AND ' . $wpdb->posts . '.post_title LIKE \'' . esc_sql( $wpdb->esc_like( $starts_with ) ) . '%\'';

    }

    return $where;

}

然后:


<?php


/**

 * Outputs an alphabetic paginator.

 *

 * @return void

 */

function tomtom_output_alphabetic_paginator() {

    $posts = get_posts( array(

        'numberposts' => -1,

        'post_type'   => 'exposant',

        'orderby'     => 'title',

        'order'       => 'ASC',

    ) ); 

        

    $firstLetters = array();

    foreach ( $posts as $post ) {

        $title              = $post->post_title;

        $startingLetter     = substr( $title, 0, 1 );

        $dupeFirstLetters[] = $startingLetter;

    }


    $firstLetters = array_unique( $dupeFirstLetters );

    sort( $firstLetters );


    echo "<a href=\"/exposants/#exposants\">" . __('Tout', 'festival') . "</a>";

    foreach ( $firstLetters as $letter ) {

        echo "<a href=\"?lettre={$letter}\">{$letter}</a>";

    }

}


/**

 * Gets an array of exposant custom post types.

 *

 * @return array

 */

function tomtom_get_exposants() {

    $args = array(

        'posts_per_page' => -1,

        'post_type' => 'exposant',

        'orderby' => 'title',

        'order' => 'ASC',

    );

    if ( ! empty( $_GET['lettre'] ) ) {

        $args['starts_with'] = $_GET['lettre'];

    }

    return new WP_Query( $args );

}


/**

 * Adds fields to an exposant custom post type object.

 *

 * @param WP_Post $exposant Exposant custom post type.

 * @return void

 */

function tomtom_hydrate_exposant( &$exposant ) {

    $exposant->logo        = get_field( 'logo', $exposant->ID );

    $exposant->related     = get_field( 'pieces_liees', $exposant->ID );

    $exposant->description = get_field( 'description', $exposant->ID );

}


/**

 * Outputs links related to exposant custom post type object.

 *

 * @return void

 */

function tomtom_output_related( $exposant ) {

    if ( ! isset( $exposant->related ) ) {

        tomtom_hydrate_exposant( $exposant );

    }

    foreach ( $exposant->related as $k => $category ) { 

        if ( $k ) {

            echo '/';

        }

        echo "<a href=\"" . get_the_permalink( $category ) . "\">" . get_the_title( $category ) . "</a>";

    }

}


?>

<div class="exposant__filter" id="exposants">   

    <?php tomtom_output_alphabetic_paginator(); ?>

</div>


<?php $exposantsArchive = tomtom_get_exposants(); ?>

<div class="row row--2col u-m-top--8">

<?php foreach ( $exposantsArchive as $exposant ): ?>

    <?php tomtom_hydrate_exposant( $exposant ); ?>

    

    <div class="exposant__thumb col--padding-right">

        <div class="exposant__logo">

            <img src="<?php echo $exposant->logo['url'] ?>" alt="<?php echo $exposant->logo['alt'] ?>">

        </div>

        <div class="exposant__thumb-content">

            <h2 class="heading--as-h4 heading--no-margin"><?php echo $exposant->post_title; ?></h2>

            <?php if ( $exposant->related ): ?>

            <p class="exposant__categories">

                <?php tomtom_output_related( $exposant->related ); ?>

            </p>

            <?php endif; ?>

            <p class="exposant-thumb__excerpt"><?php echo wp_trim_words( $exposant->description, 16, '...' ); ?></p>

            <a href="<?php get_permalink( $exposant->ID ); ?>" class="btn"><?php _e( 'Plus de détails', 'festival' ); ?></a>

        </div>

    </div>

<?php endforeach; ?>

</div>



查看完整回答
反对 回复 2023-12-15
  • 1 回答
  • 0 关注
  • 55 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信