【问题标题】:Let users sort posts in Wordpress让用户在 Wordpress 中对帖子进行排序
【发布时间】:2013-12-24 11:28:14
【问题描述】:

我想创建一个页面,用于根据一些条件过滤帖子。

我可以使用wp_query 并很容易地发布帖子,我的问题是我无法弄清楚(我也无法在网上找到任何答案,相信我看过)如何让用户这样做。

以此为例,按价格(自定义字段元值)从高到低的顺序返回帖子,共有 33 个帖子。

<?php 

$featuredPosts = new WP_Query( array(
'posts_per_page' => 33,
   'meta_key'=>'Price',
   'orderby' => 'meta_value_num',
   'order' => DESC
) );

?>

<?php if ( $featuredPosts->have_posts() ) : ?>

<?php while ( $featuredPosts->have_posts() ) : $featuredPosts->the_post(); ?>

<article <?php post_class('item-post block'); ?> id="post-<?php the_ID(); ?>">
<h2 class="price-title"><?php the_title(); ?> </h2>

</article> <!-- end div post -->

<?php endwhile; wp_reset_query(); ?>

<?php endif; ?>

现在,即使在阅读和谷歌搜索之后,如果我能弄清楚如何在前端实现此功能以供用户过滤帖子,我会被诅咒的。

我的意思是,我知道您可以附加到 Wordpress 中的 URL 以更改帖子的顺序,但在这种情况下我完全迷失了。

我试过了,但它不起作用。

<?php

$by_price = esc_url(add_query_arg(array(
    'meta_key' => 'price',
    'orderby' => 'meta_value_num',
    'order' => ASC
)));
$by_date = esc_url(add_query_arg(array(
    'orderby' => 'date',
    'order' => DESC
)));

?>

<ul>
    <li><a href="<?php echo $by_price;?>">Order by price</a></li>
    <li><a href="<?php echo $by_date;?>">Order by date</a></li>
</ul>

我想要实现的其实也很简单,让用户选择类别,选择价格范围(猜想我会在 JQuery 中写一些东西来将值传递到字段中),设置数量他们希望返回的结果。

我已经尝试在阳光下搜索 所有我能想到的,没有骰子。

【问题讨论】:

    标签: wordpress sorting loops


    【解决方案1】:

    试试Simple Custom Post Order plugin

    它使用 AJAX 和 JavaScript,您无需加载任何其他内容。您只需拖放帖子即可。

    【讨论】:

    • 这是用于后端过滤,而不是 OP 想要的。
    【解决方案2】:

    好的,我更新代码以使其清晰:

    ---我不认为 meta_key 会自动拾取---

    functions.php

    ...
    
        $whitList = array(
           'price' => array(
             'posts_per_page' => 33,
             'meta_key'=>'price',
             'orderby'=>'meta_value_num',
             'order' => ASC
           ),
           'date' => array(
             'posts_per_page' => 33,
             'orderby'=>'date',
             'order' => DESC
           )
        );
    ...
    

    你的第一个循环 php:

    <?php 
    
    gloabl $whitList; //to use the $whitList in your functions.php.
    
    $aryQuery = $whitList[$_REQUEST['orderby']] ? $whitList[$_REQUEST['orderby']] : $whitList['price'];
    
    $featuredPosts = new WP_Query( $aryQuery ); 
    
    ....
    ....
    ?>
    

    对于您的列表页面:

    <ul>
    <?php
       gloabl $whitList; //to use the $whitList in your functions.php.
       foreach( $whitList as $orderby => $aryOrderBySettings){
          ?>
          <li> <a href="<?php echo esc_url(add_query_arg('orderby', $orderby));?>">Order by <?php echo $orderby;?></a></li>
          <?php
       }
     ?>
    </ul>
    

    【讨论】:

    • 第二部分是否需要在循环内?
    • 除非我将第二部分从第一部分放在循环中,否则它永远不会出现在页面上。
    • 对不起,$whitList 的定义必须放在一个全局的地方,例如:functions.php;否则,第二个 php 仍然找不到 $whitList
    • 哦,我明白了,所以我可以继续添加新数组,例如 'popular' => 数组 ('posts_per_page' => 33, 'meta_key' => 'wpb_post_views_count', 'orderby' => ' meta_value_num', 'order' => 'DESC' ) ?是否可以在价格中添加特定范围之类的内容?顺便说一句,它只有在我删除 'gloabl $whitList; 时才有效。 //在你的functions.php中使用$whitList。'从列表页面部分。
    • 是的,您可以输入价格范围,请查看codex.wordpress.org/Class_Reference/… - 请特别注意meta_querycompare。但是,它背后的想法是 - 不接受客户端提供的数据,客户端只提供白名单中预定义的命令。
    【解决方案3】:

    使用$_GET 参数是这里的方法。首先你要允许你的访问者访问这些添加这些变量。总体而言,链接方法很好,因此我们可以通过使用 add_query_arg 将额外参数附加到当前 URL 来生成增强链接。

    <?php
        $urla = add_query_arg( 'sort' => 'price', 'asc' => '1' );
        $urld = add_query_arg( 'sort' => 'price', 'asc' => '0' );
    ?>
    <a href="<?php echo esc_url( $url ); ?>">Sort by price (asc)</a>
    <a href="<?php echo esc_url( $url ); ?>">Sort by price (desc)</a>
    

    点击后,可以检测到附加的变量:

    <?php
        // Get an allowed sort variable and the order
        $sort = isset( $_GET['sort'] ) && in_array( $_GET['sort'], array( 'price' ) ) )
                ? $_GET['sort'] : null;
        $order = isset( $_GET['asc'] ) && $_GET['asc'] == '0' ? 'DESC' : 'ASC';
    ?>
    

    现在您将使用刚刚检索到的数据来扩充您的主查询。如果您使用默认方式查询页面上的帖子,您应该可以使用query_posts,尽管它是not recomended。而且,如果您使用的是自定义循环,只需将新参数注入其中:

    <?php
        $args = array();
        switch ( $sort ):
            case 'price':
                $args['order'] = $order;
                $args['orderby'] = 'meta_value_num';
                $args['meta_key'] = 'price';
                break;
            default:
                break;
        endswitch;
    
        $defaults = array( 'posts_per_page' => 33 );
        $query = new WP_Query( wp_parse_args( $args, $defaults ) );
    ?>
    

    您可以添加更多变量,方法是创建更多 URL 和要按下的按钮,并在 switch 语句中添加更多案例来扩展上面的基本示例。

    第一段代码可以放在您希望按钮出现的任何位置。第二段代码在第三段代码之前,第三段代码在输出结果之前。

    【讨论】:

      猜你喜欢
      • 2014-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-03
      • 1970-01-01
      • 1970-01-01
      • 2017-06-29
      相关资源
      最近更新 更多