通过wordpress URL字符串中的元键查询

时间:2014-03-31 23:05:36

标签: php wordpress

我觉得我已经在网络上,并再次寻找答案,这真的开始磨练我的齿轮。

不确定这是否是正确的方法,但我想以query_arg的形式将一个query_posts数组添加到URL。这是我们的查询:

query_posts( array( 'meta_key' => 'rank', 'orderby' => 'meta_value_num', 'order' => 'DESC' , 'paged' => $paged,

如何使用add_query_arg将其传递给URL,以便使用该meta_key / query_posts数组重新排序帖子? 我试过这个,它似乎没有改变帖子的顺序,这里有一些我想念的东西。

<a href="<?php echo $by_rank;?>">  Rank </a>
     <?php $by_rank= esc_url(add_query_arg(array('meta_key' => 'rank',  'orderby' => 'meta_value_num', 'order' => 'DESC'))); ?>

我想将查询变量添加到URL字符串的原因是,用户可以根据meta_key / meta_value对类别页面上的帖子进行排序。除了使用meta_key之外,以类似的方式进行排序?orderby = date。

这可以做到,对吗?因为我认真开始认为这是不可能的。

来自Rahil的回答

<?php
$meta_key = (isset($_GET['meta_key'])) ?
            sanitize_text_field($_GET['meta_key']) : 'rank'; // use default value here ''

$orderby = (isset($_GET['orderby'])) ?
           sanitize_text_field($_GET['orderby']) : 'meta_value_num'; // use default value here ''

$order = (isset($_GET['order'])) ?
         sanitize_text_field($_GET['order']) : 'DESC'; // use default value here ''

$by_rank = esc_url(add_query_arg(array(
    'meta_key' => $meta_key,
    'orderby' => $orderby,
    'order' => $order
)));
?>
<a href="<?php echo $by_rank;?>">  Rank </a>

输入值,与其他页面上的query_posts数组一样正常的值,帖子不会重新排序。

2 个答案:

答案 0 :(得分:0)

你实际上正在做add_query_arg罚款,但在分配变量之前回显变量是你的问题。

<a href="<?php echo $by_rank;?>">  Rank </a>
--------------------^^^^^^^^ ----->> undefined variable

 <?php $by_rank= esc_url(add_query_arg(array('meta_key' => 'rank',  'orderby' => 'meta_value_num', 'order' => 'DESC'))); ?>
 ------^^^^^^^^ ----> Now its defined.

更改为:(记住代码从上到下运行)

<?php
$meta_key = (isset($_GET['meta_key'])) ?
            sanitize_text_field($_GET['meta_key']) : ''; // use default value here ''

$orderby = (isset($_GET['orderby'])) ?
           sanitize_text_field($_GET['orderby']) : ''; // use default value here ''

$order = (isset($_GET['order'])) ?
         sanitize_text_field($_GET['order']) : ''; // use default value here ''

$by_rank = esc_url(add_query_arg(array(
    'meta_key' => $meta_key,
    'orderby' => $orderby,
    'order' => $order
)));
?>
<a href="<?php echo $by_rank;?>">  Rank </a>

现在为$by_rank分配了一个值,您可以回复它。它将输出

/?meta_key=rank&orderby=meta_value_num&order=DESC

修改

现在您必须将变量$meta_key$orderby$order置于query_posts()函数之上:

像这样:

query_posts(array(
    'meta_key' => $meta_key,
    'orderby' => $orderby,
    'order' => $order,
    'paged' => $paged
));

现在更改来自网址的查询字符串会影响query_posts()

答案 1 :(得分:0)

答案: -

function wpse139657_orderby(){
    if( isset($_GET['orderby']) ){
        $order = $_GET['order'] or 'DESC';
        set_query_var('orderby', 'meta_value_num');
        set_query_var('meta_key', $_GET['orderby']);
        set_query_var('order', $order);
    }
}

add_filter('pre_get_posts','wpse139657_orderby');

创建一个pre_get_posts过滤器,只需将meta_key名称传递给URL,就像这样?orderby = rank