首页 文章

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

提问于
浏览
0

我觉得我已经到处都是网络,然后又回来寻找答案,这真的开始磨练我的齿轮了 .

不确定这是否是正确的方法,但我想以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 .

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

来自拉希尔的回答

<?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

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

    <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
    

    Edit:

    现在你必须将变量 $meta_key$orderby$order 放在你的 query_posts() 函数上面:

    像这样:

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

    现在从url更改查询字符串将影响 query_posts()

  • 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

相关问题