【问题标题】:wordpress get_search_query() in functions.php is emptyfunctions.php 中的 wordpress get_search_query() 为空
【发布时间】:2021-10-04 22:26:44
【问题描述】:

在functions.php 中使用get_search_query() 执行wp_query 时,我无法获取搜索词。

function load_posts() {
    $ppp = (isset($_POST["ppp"])) ? $_POST["ppp"] : 20;
    $page = (isset($_POST['page'])) ? $_POST['page'] : 1;
 
    $args = array(
        'suppress_filters' => true,
        'post_type' => 'post',
        'ignore_sticky_posts'   => true,
        'post_status' => array('publish'),
        'orderby'           => 'post_date',
        'order'             => 'DESC',
        'posts_per_page' => $ppp,
        'paged'             => $page,
        's' => get_search_query(), //i need access to search term here
    );

    $loop = new WP_Query($args);
    echo '<pre>' . var_export($args, true) . '</pre>';
}
add_action('wp_ajax_nopriv_load_posts','load_posts');
add_action('wp_ajax_load_posts','load_posts');

这在functions.php中返回: 正如您在's' =&gt; '', 下看到的那样,搜索为空。

array (
  'suppress_filters' => true,
  'post_type' => 'post',
  'ignore_sticky_posts' => true,
  'post_status' => 
  array (
    0 => 'publish',
  ),
  'orderby' => 'post_date',
  'order' => 'DESC',
  'posts_per_page' => '20',
  'paged' => '1',
  's' => '',
)

在 search.php 中运行完全相同的代码,它具有搜索值。 (唯一的区别是posts_per_page 但没关系)

array (
  'suppress_filters' => true,
  'ignore_sticky_posts' => true,
  'post_type' => 'post',
  'post_status' => 
  array (
    0 => 'publish',
  ),
  'orderby' => 'post_date',
  'order' => 'DESC',
  'posts_per_page' => 4,
  'paged' => 1,
  's' => 'Hydro',
)

为了执行functions.php中的代码,我做了一个ajax请求来调用load_posts函数 (这很好用)

jQuery.post(ajaxUrl, {
            action: "load_posts",
            page: page,
            ppp: ppp
        })

如果需要,我很乐意提供更多信息,但我不明白为什么函数.php 中没有搜索值

任何帮助表示赞赏!

编辑:我发现这个线程说在functions.php中调用is_search()函数为时过早,因为它在搜索之前加载。我猜这与 get_search_query() 的问题相同。但仍然需要访问 function.php 中的搜索词并且不知道如何获取该值。

https://stackoverflow.com/a/53608188/11524115

【问题讨论】:

标签: php wordpress


【解决方案1】:

应该使用parse_query 操作,因为此时 WordPress 将为您设置大部分内容。

parse_query 是 WP_Query->parse_query() 设置好查询变量(例如用于条件标签的各种is_ 变量)后触发的操作。

您可能还想仔细检查您是否也在主查询中,这段代码就是这样做的。

add_action(
    'parse_query',
    function() {
        if(is_main_query() && is_search()){
            var_dump(get_search_query());
        }
    }
);

编辑

如果您更新的帖子显示了您如何使用它,上述方法将不起作用。

函数get_search_query 最终是对get_query_var 的调用,它只是一个访问全局$wp_query 对象的全局函数。但是,您没有使用全局 $wp_query 对象,而是通过调用 new WP_Query() 创建自己的对象。我认为您要做的最简单的事情就是使用$_GET['s'] 获取查询参数。 (我假设s,但如果你使用其他东西,显然改变它。)

【讨论】:

  • 该代码在function.php中有效,但仍不确定如何将该值传递给functions.php中的load_posts()函数
  • 我用 load_posts() 函数更新了问题,使其更清晰
猜你喜欢
  • 2018-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-28
  • 1970-01-01
  • 1970-01-01
  • 2015-02-05
  • 2017-03-04
相关资源
最近更新 更多