Wp Query сортировка на основании пользовательского MetaBox

Вопрос или проблема

Я пытаюсь отсортировать список постов на основе meta_key суммы сделки, чтобы сначала отображалась самая большая сделка и постепенно уменьшались до меньших сумм сделок. Сумма сделки может быть от 1,000 до 9,000,000. В настоящее время приведенный ниже код сортирует суммы сделок на основе первой цифры. Так что если у меня есть транзакция на 6,000 и 6,000,000, они будут отображаться рядом, вместо того чтобы сначала показывать 6,000,000. Сумма сделки извлекается из настраиваемого MetaBox в CMB2. Есть ли что-то, что я упускаю в своем коде, из-за чего сортировка не распознает количество после запятой?

Мой WP_Query

     <?php
            $transaction = new WP_Query( array( 
                'post_type'         => 'transactions', 
                'paged'             => $paged, 
                'posts_per_page'    => 50,
                'orderby'           => array( 'meta_value_num' => 'ASC' ),
                'meta_key'          => 'deal_amount',
            ) );

        if ( $transaction->have_posts() ) : ?>
        <?php 
        while ( $transaction->have_posts() ) : $transaction->the_post();
            $deal_amount = get_post_meta( get_the_ID(), 'deal_amount', true );
            $property_type = get_post_meta( get_the_ID(), 'property_type', true );
            $property_size = get_post_meta( get_the_ID(), 'property_size', true );
        ?>
        <article class="col">

            <div class="trans-content">
                <?php the_title('<h3>', '</h3>'); ?>
                <?php echo '<h4>$' . esc_html($deal_amount) . '</h4>'; ?>
                <?php echo esc_html($property_type); ?><br>
                <?php echo esc_html($property_size); ?><br>
                <?php $terms_as_text = get_the_term_list( $post->ID, 'loan-type', '', ', ', '' ) ; echo strip_tags($terms_as_text); ?></p>
            </div>
        <?php edit_post_link('edit'); ?>
        </article>
        <?php endwhile; wp_reset_postdata(); ?>
        <?php else : endif; ?>

MetaBox

add_action( 'cmb2_admin_init', 'transactions_metabox' );
 function transactions_metabox() {
$prefix = 'transactions_';
$cmb = new_cmb2_box( array(
    'id'            => $prefix . 'transactions',
    'title'         => esc_html__( 'Transactions', 'cvcapital' ),
    'object_types'  => array( 'transactions', ),

) );
$cmb->add_field( array(
    'name'              => 'Deal Amount',
    'id'                => 'deal_amount',
    'type'              => 'text',
    'before_field'      => '$', 
    'column'            => true, // Display field value in the admin post-listing columns
    'before_display'    => '$',
) );

С помощью @jacobPeattie ниже приведен рабочий пример. Как только я удалил запятые, все стало работать прекрасно. Я добавил number_format к сумме сделки, чтобы автоматически добавлять запятые на фронтэнде.

<?php
        $transaction = new WP_Query( array( 
            'post_type'         => 'transactions', 
            'paged'             => $paged, 
            'posts_per_page'    => 50,
            'orderby'           => array( 'meta_value_num' => 'ASC' ),
            'meta_key'          => 'deal_amount',
        ) );

    if ( $transaction->have_posts() ) : ?>
    <?php 
    while ( $transaction->have_posts() ) : $transaction->the_post();
        $deal_amount = get_post_meta( get_the_ID(), 'deal_amount', true );
        $property_type = get_post_meta( get_the_ID(), 'property_type', true );
        $property_size = get_post_meta( get_the_ID(), 'property_size', true );
    ?>
    <article class="col">

        <div class="trans-content">
            <?php the_title('<h3>', '</h3>'); ?>
            <?php echo '<h4>$' . number_format($deal_amount) . '</h4>'; ?>
            <?php echo esc_html($property_type); ?><br>
            <?php echo esc_html($property_size); ?><br>
            <?php $terms_as_text = get_the_term_list( $post->ID, 'loan-type', '', ', ', '' ) ; echo strip_tags($terms_as_text); ?></p>
        </div>
    <?php edit_post_link('edit'); ?>
    </article>
    <?php endwhile; wp_reset_postdata(); ?>
    <?php else : endif; ?>

Ответ или решение

Вопрос о сортировке постов в WordPress на основе пользовательского метаполя стал ключевой темой данной задачи. Вы стремитесь организовать транзакции по убыванию сделки, используя метаполе "deal_amount". Проблема, с которой вы столкнулись, заключается в том, что текущая сортировка воспринимает значения как строки, поэтому 6,000 идет перед 6,000,000, так как сортировка происходит по первым символам, а не по числовым значениям.

Причина проблемы

Проблема связана с представлением данных в текстовом формате. Несмотря на то, что была попытка использовать 'meta_value_num' в параметрах orderby, наличие запятых в значениях превращает их в строки, что препятствует их правильной интерпретации как чисел.

Решение проблемы

Оптимизировать код можно, изменив формат хранения величин в базе данных и используя number_format() на уровне отображения. Это позволит выполнить сортировку корректно, а удовлетворительные визуальные изменения применять уже при выводе данных.

Необходимые шаги для решения:

  1. Обновление хранения данных:
    Убедитесь, что в базе данное значение хранится как число, без запятых.

  2. Обновление кода для сортировки:

    $transaction = new WP_Query( array( 
       'post_type'         => 'transactions', 
       'paged'             => $paged, 
       'posts_per_page'    => 50,
       'orderby'           => array( 'meta_value_num' => 'DESC' ), // Изменил на DESC для сортировки по убыванию
       'meta_key'          => 'deal_amount',
    ) );
  3. Использование number_format() для отображения:

    while ( $transaction->have_posts() ) : $transaction->the_post();
       $deal_amount = get_post_meta( get_the_ID(), 'deal_amount', true );
       $deal_amount_formatted = number_format( $deal_amount ); // Применение number_format
    ?&gt;
    <article class="col">
       <div class="trans-content">
           &lt;?php the_title('&lt;h3&gt;', '&lt;/h3&gt;'); ?&gt;
           &lt;?php echo '&lt;h4&gt;$' . esc_html($deal_amount_formatted) . '&lt;/h4&gt;'; ?&gt;
           // прочий вывод...
       &lt;/div&gt;
    &lt;/article&gt;
    &lt;?php endwhile; wp_reset_postdata(); ?&gt;

Итог

Преобразовав данные перед сохранением для эффективности сортировки и используя number_format() для удобочитаемого вывода, вы сможете оптимизировать процесс отображения транзакций. Убедитесь, что всегда проверяете возможные ошибки ввода данных и предоставляете пользователю корректную информацию.

SEO оптимизация и читабельность

Важно, чтобы каждое техническое решение было подкреплено соответствующими объяснениями, которые помогают улучшить пользовательский опыт. Использование ключевых слов, связанных с WordPress, WP_Query, сортировкой и пользовательскими метаполями, повысит релевантность для поисковых систем.

Оцените материал
Добавить комментарий

Капча загружается...