.= 'tag.htm'; break; case 'flag': $pre .= $default_pre .= 'flag.htm'; break; case 'my': $pre .= $default_pre .= 'my.htm'; break; case 'my_password': $pre .= $default_pre .= 'my_password.htm'; break; case 'my_bind': $pre .= $default_pre .= 'my_bind.htm'; break; case 'my_avatar': $pre .= $default_pre .= 'my_avatar.htm'; break; case 'home_article': $pre .= $default_pre .= 'home_article.htm'; break; case 'home_comment': $pre .= $default_pre .= 'home_comment.htm'; break; case 'user': $pre .= $default_pre .= 'user.htm'; break; case 'user_login': $pre .= $default_pre .= 'user_login.htm'; break; case 'user_create': $pre .= $default_pre .= 'user_create.htm'; break; case 'user_resetpw': $pre .= $default_pre .= 'user_resetpw.htm'; break; case 'user_resetpw_complete': $pre .= $default_pre .= 'user_resetpw_complete.htm'; break; case 'user_comment': $pre .= $default_pre .= 'user_comment.htm'; break; case 'single_page': $pre .= $default_pre .= 'single_page.htm'; break; case 'search': $pre .= $default_pre .= 'search.htm'; break; case 'operate_sticky': $pre .= $default_pre .= 'operate_sticky.htm'; break; case 'operate_close': $pre .= $default_pre .= 'operate_close.htm'; break; case 'operate_delete': $pre .= $default_pre .= 'operate_delete.htm'; break; case 'operate_move': $pre .= $default_pre .= 'operate_move.htm'; break; case '404': $pre .= $default_pre .= '404.htm'; break; case 'read_404': $pre .= $default_pre .= 'read_404.htm'; break; case 'list_404': $pre .= $default_pre .= 'list_404.htm'; break; default: $pre .= $default_pre .= theme_mode_pre(); break; } if ($config['theme']) { $conffile = APP_PATH . 'view/template/' . $config['theme'] . '/conf.json'; $json = is_file($conffile) ? xn_json_decode(file_get_contents($conffile)) : array(); } !empty($json['installed']) and $path_file = APP_PATH . 'view/template/' . $config['theme'] . '/htm/' . ($id ? $id . '_' : '') . $pre; (empty($path_file) || !is_file($path_file)) and $path_file = APP_PATH . 'view/template/' . $config['theme'] . '/htm/' . $pre; if (!empty($config['theme_child']) && is_array($config['theme_child'])) { foreach ($config['theme_child'] as $theme) { if (empty($theme) || is_array($theme)) continue; $path_file = APP_PATH . 'view/template/' . $theme . '/htm/' . ($id ? $id . '_' : '') . $pre; !is_file($path_file) and $path_file = APP_PATH . 'view/template/' . $theme . '/htm/' . $pre; } } !is_file($path_file) and $path_file = APP_PATH . ($dir ? 'plugin/' . $dir . '/view/htm/' : 'view/htm/') . $default_pre; return $path_file; } function theme_mode_pre($type = 0) { global $config; $mode = $config['setting']['website_mode']; $pre = ''; if (1 == $mode) { $pre .= 2 == $type ? 'portal_category.htm' : 'portal.htm'; } elseif (2 == $mode) { $pre .= 2 == $type ? 'flat_category.htm' : 'flat.htm'; } else { $pre .= 2 == $type ? 'index_category.htm' : 'index.htm'; } return $pre; } ?>How to order posts by meta_value created inside loop?
最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

How to order posts by meta_value created inside loop?

programmeradmin1浏览0评论

Inside the WP_Query, I'm trying to order posts by price.

The problem is that the price value is not manually defined inside an ACF or so, but it comes from an api call made while looping trough posts, like this:

<?php while ( have_posts() ): the_post();

$asin = get_field("asin");?>

<h3><?php the_title(); ?></h3>
<p><?php echo aawp_get_field_value($asin, 'price'); ?></p>

<?php endwhile; ?>

That means that the numeric value (the price) isn't available before actually running $the_query, so I cannot use something like:

'meta_key' => 'price',
'orderby' => 'meta_value_num',
'order' => 'ASC'

because "price" does not exists at that time.

I searched a lot but I didn't find a solution to this. Maybe I need to order posts after the loop? How would you do that?

Thanks in advance!

EDIT (based on shanebp answer)

I made this way.

    <?php
 
    $the_query = new WP_Query( array (
        'post_type' => 'prodotto',
        'posts_per_page' => 500,
        'fields' => 'ids',
        'tax_query' => array(
            array (
                'taxonomy' => 'categoria',
                'field' => 'slug',
                'terms' => 'uso-quotidiano',
            )
        ),
    ));

    $items = array();

    $posts = $the_query->posts;

    foreach($posts as $post) {

        $asin = get_field("asin");
        $price = aawp_get_field_value($asin, 'price');

        // refining price value
        $price = str_replace(',', '.', $price);
        $price = preg_replace("/[^0-9\.]/", "", $price);
        $price = (float)$price;

        $items[] = array("id"=>get_the_ID(), "price"=>$price);
    }


    // sorting (asc)
    usort($items, function ($item1, $item2) {
        return $item1['price'] <=> $item2['price'];
    });

    // OUTPUT
    echo '<section class="suggested_product_card_container">';

    foreach ($items as $item) {
        $itemPrice = $item['price'];
        if ($itemPrice < 29) {
              $itemID = $item['id'];
              include(locate_template('/template-parts/components/component-suggested-product-card.php'));
        }
    }

    echo '</section>';

    wp_reset_postdata();

    ?>

Inside the WP_Query, I'm trying to order posts by price.

The problem is that the price value is not manually defined inside an ACF or so, but it comes from an api call made while looping trough posts, like this:

<?php while ( have_posts() ): the_post();

$asin = get_field("asin");?>

<h3><?php the_title(); ?></h3>
<p><?php echo aawp_get_field_value($asin, 'price'); ?></p>

<?php endwhile; ?>

That means that the numeric value (the price) isn't available before actually running $the_query, so I cannot use something like:

'meta_key' => 'price',
'orderby' => 'meta_value_num',
'order' => 'ASC'

because "price" does not exists at that time.

I searched a lot but I didn't find a solution to this. Maybe I need to order posts after the loop? How would you do that?

Thanks in advance!

EDIT (based on shanebp answer)

I made this way.

    <?php
 
    $the_query = new WP_Query( array (
        'post_type' => 'prodotto',
        'posts_per_page' => 500,
        'fields' => 'ids',
        'tax_query' => array(
            array (
                'taxonomy' => 'categoria',
                'field' => 'slug',
                'terms' => 'uso-quotidiano',
            )
        ),
    ));

    $items = array();

    $posts = $the_query->posts;

    foreach($posts as $post) {

        $asin = get_field("asin");
        $price = aawp_get_field_value($asin, 'price');

        // refining price value
        $price = str_replace(',', '.', $price);
        $price = preg_replace("/[^0-9\.]/", "", $price);
        $price = (float)$price;

        $items[] = array("id"=>get_the_ID(), "price"=>$price);
    }


    // sorting (asc)
    usort($items, function ($item1, $item2) {
        return $item1['price'] <=> $item2['price'];
    });

    // OUTPUT
    echo '<section class="suggested_product_card_container">';

    foreach ($items as $item) {
        $itemPrice = $item['price'];
        if ($itemPrice < 29) {
              $itemID = $item['id'];
              include(locate_template('/template-parts/components/component-suggested-product-card.php'));
        }
    }

    echo '</section>';

    wp_reset_postdata();

    ?>
Share Improve this question edited Nov 25, 2020 at 8:33 Luca asked Nov 22, 2020 at 16:31 LucaLuca 134 bronze badges 2
  • What is the implementation of aawp_get_field_value? For help with AAWP you should contact AAWP support getaawp 3rd party plugin dev support is off topic here – Tom J Nowell Commented Nov 22, 2020 at 21:50
  • moved comment below – shanebp Commented Nov 25, 2020 at 18:10
Add a comment  | 

1 Answer 1

Reset to default 1

In your WP_Query, only return ids. https://developer.wordpress/reference/classes/wp_query/#return-fields-parameter

Create an empty array, $myArray = array();. Then loop thru the results of the query, $your_query->posts and fetch your field value for each id and add the result and the id to a new array in $myArray.

Then sort the arrays in $myArray by the price.

Then do a loop thru $myArray to output the display you want for each post id.

发布评论

评论列表(0)

  1. 暂无评论