更智能地给出 ACF 字段的最低值

问题描述 投票:0回答:1

目前我使用以下函数给出 ACF 字段的最小编号。该代码可以工作,但不是最聪明、最节省资源的方式。

add_shortcode( 'LEASINGFAKTOR', 'leaserate_shortcode' );
function leaserate_shortcode () {
$args = array(
        'posts_per_page'=> -1,
        'post_type'     => 'fahrzeuge',
        'meta_key'      => 'leasingfaktor',
    );
    $low_rate_query = new WP_Query( $args ); 
    $rate = array();

    if( $low_rate_query->have_posts() ):
        while( $low_rate_query->have_posts() ) : $low_rate_query->the_post();
            $rate = get_field('leasingfaktor'); 
            if(isset($rate) && !empty($rate)){
                $rates[] = $rate; 
            }
        endwhile;
        $max_rate = max($rates);
        $min_rate = min($rates);

        endif; wp_reset_query();
        return $min_rate;
}

有什么让它更清洁、更快、更智能的想法吗?

php wordpress advanced-custom-fields min shortcode
1个回答
0
投票

好吧,您可以使用

get_posts
而不是使用
WP_Query
,因为您只需要可以与
get_field
一起使用的帖子 ID 数组,并且使用
get_posts
您不需要执行
while
循环,和
wp_reset_query

您可以做的另一项改进是使用

array_map
而不是
foreach
,因为您不会尝试在此处生成任何 HTML 或不执行任何复杂的操作。你只是想获得一个
rates
数组,所以
array_map
在这种情况下更好,并且易于使用,代码会很短。

所以使用

get_posts
array_map
的最终代码将如下所示:

/**
 * Shortcode function
 */
function leaserate_shortcode() {
    $query_args = array(
        'posts_per_page' => -1,
        'post_type'      => 'fahrzeuge',
        'meta_key'       => 'leasingfaktor', // phpcs:ignore WordPress.DB.SlowDBQuery
        'fields'         => 'ids', // We just need ids for our work.
    );

    /**
     * We will use get_posts instead of using WP_Query
     * Because it's easy to use in this case and $no_found_rows
     * is set to false that will give fast performance
     */
    $post_ids = get_posts( $query_args );

    // Set default min rate.
    $min_rate = 0;

    // Check if we found ids or not.
    if ( ! empty( $post_ids ) ) {
        /**
         * We don't need to do foreach or for loop here
         * We can use an array map and map the post ids array
         * with the values.
         * So we will have an array of rates in the result
         */
        $rates = array_map(
            function( $id ) {
                // we use using type transform using (int)
                // assuming returning value will be a number or string number.
                return (int) get_field( 'leasingfaktor', $id );
            },
            $post_ids
        );

        // Filter empty values and get unique values.
        $rates = array_unique( array_filter( $rates ) );

        // Check if the final array is not empty.
        if ( ! empty( $rates ) ) {
            $min_rate = min( $rates );
        }
    }

    return $min_rate;
}
add_shortcode( 'LEASINGFAKTOR', 'leaserate_shortcode' );
© www.soinside.com 2019 - 2024. All rights reserved.