Вопрос или проблема
Я пытаюсь отсортировать список постов на основе 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()
на уровне отображения. Это позволит выполнить сортировку корректно, а удовлетворительные визуальные изменения применять уже при выводе данных.
Необходимые шаги для решения:
-
Обновление хранения данных:
Убедитесь, что в базе данное значение хранится как число, без запятых. -
Обновление кода для сортировки:
$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', ) );
-
Использование
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 ?> <article class="col"> <div class="trans-content"> <?php the_title('<h3>', '</h3>'); ?> <?php echo '<h4>$' . esc_html($deal_amount_formatted) . '</h4>'; ?> // прочий вывод... </div> </article> <?php endwhile; wp_reset_postdata(); ?>
Итог
Преобразовав данные перед сохранением для эффективности сортировки и используя number_format()
для удобочитаемого вывода, вы сможете оптимизировать процесс отображения транзакций. Убедитесь, что всегда проверяете возможные ошибки ввода данных и предоставляете пользователю корректную информацию.
SEO оптимизация и читабельность
Важно, чтобы каждое техническое решение было подкреплено соответствующими объяснениями, которые помогают улучшить пользовательский опыт. Использование ключевых слов, связанных с WordPress, WP_Query, сортировкой и пользовательскими метаполями, повысит релевантность для поисковых систем.