【问题标题】:Querying by meta keys in wordpress URL string通过 wordpress URL 字符串中的元键查询
【发布时间】:2014-03-31 23:05:35
【问题描述】:

我觉得我一直在网上四处寻找这个问题的答案,而这真的开始磨砺我的齿轮了。

不确定这是否是正确的方法,但我想以 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 对类别页面上的帖子进行排序。有点类似于执行 ?orderby=date 的方式,除了使用 meta_key。

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

来自拉希尔的回答

<?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 数组一起正常工作的相同值,帖子不会重新排序。

【问题讨论】:

    标签: php wordpress


    【解决方案1】:

    答案:-

    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

    【讨论】:

      【解决方案2】:

      你实际上在做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
      ));
      

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

      【讨论】:

      • 试过了,由于某种原因它仍然没有重新排序帖子。我有一个带有该查询的页面模板,并且可以很好地重新排序帖子,但由于某种原因,URL 字符串不会做任何事情。这个真的开始吸引我了。
      • 它所做的只是将字符串添加到 URL,但帖子的顺序相同。很奇怪。
      • 您是否尝试使用$_GET在您的query_posts 上输入值?
      • 我没有,我该怎么做?
      • 那么实际上你需要查询那些附加到url的字段吗?
      猜你喜欢
      • 2020-02-14
      • 1970-01-01
      • 2015-03-14
      • 2012-06-18
      • 2018-12-12
      • 2021-09-28
      • 2012-01-14
      • 1970-01-01
      • 2016-04-06
      相关资源
      最近更新 更多