如何在Wordpress中使用自定义搜索功能

时间:2012-02-10 01:41:21

标签: wordpress

我在WordPress博客中发现了这个自定义功能,它似乎完全符合我的需要。唯一的问题是我不知道要传递什么作为第二个参数。它要求查询,但查询是否发生在此函数的内部?我会通过什么查询?

我已经搜索了一个多小时,我一直在寻找类似的功能,所以这是我的WordPress新手在这里发挥作用。

BTW该函数应该接受搜索词(第一个参数)并返回所有帖子LIKE搜索参数的帖子。

function custom_search( $search, &$wp_query )
{
    global $wpdb;

    if ( empty( $search ) )
        return $search; // skip processing - no search term in query

    $q = $wp_query->query_vars;    
    $n = ! empty( $q['exact'] ) ? '' : '%';

    $search =
    $searchand = '';

    foreach ( (array) $q['search_terms'] as $term ) {
        $term = esc_sql( like_escape( $term ) );
        $search .= "{$searchand}($wpdb->posts.post_title LIKE '{$n}{$term}{$n}')";
        $searchand = ' AND ';
    }

    if ( ! empty( $search ) ) {
        $search = " AND ({$search}) ";
        if ( ! is_user_logged_in() )
            $search .= " AND ($wpdb->posts.post_password = '') ";
    }

    return $search;
}
add_filter( 'c_search', 'custom_search', 500, 2 );

3 个答案:

答案 0 :(得分:1)

基本上函数中的第二个参数是引用。您可以通过以下链接阅读: http://www.php.net/manual/en/functions.arguments.php

在您的情况下,如果删除函数的第二个参数并定义

global $wp_query; inside the function the code should still work, you will also have to change the `add_filter( 'c_search', 'custom_search', 500, 1 );`

或者您可以按原样保留函数,并在functions.php中的任何位置定义global $wp_query;,如果尚未定义,则将其作为参数传递

答案 1 :(得分:0)

您也可以通过以下代码进行搜索:

function __search_custom( $search, &$wp_query )
{
    global $wpdb;

    if ( empty( $search ) )
        return $search; // skip processing - no search term in query

    $q = $wp_query->query_vars;    
    $n = ! empty( $q['exact'] ) ? '' : '%';

    $search =
    $searchand = '';

    foreach ( (array) $q['search_terms'] as $term ) {
        $term = esc_sql( like_escape( $term ) );
        $search .= "{$searchand}(($wpdb->posts.post_title LIKE '{$n}{$term}{$n}') OR ($wpdb->posts.post_content LIKE '{$n}{$term}{$n}'))";
        $searchand = ' AND ';
    }

    if ( ! empty( $search ) ) {
        $search = " AND ({$search}) ";
        if ( ! is_user_logged_in() )
            $search .= " AND ($wpdb->posts.post_password = '') ";
    }

    return $search;
}
add_filter( 'posts_search', '__search_custom', 500, 2 );

如果您只想按标题搜索,请使用以下代码替换$ search:

$search .= "{$searchand}($wpdb->posts.post_title LIKE '{$n}{$term}{$n}')";

答案 2 :(得分:0)

实际上,你不应该传递任何参数......它是最后一行代码的关键;它做了什么,它增加了对函数的调用,该函数将修改它将接收的数据...... add_filter的参数是:

  1. 数据将被过滤的点
  2. 将接收和过滤数据的功能
  3. 执行的优先级(较低的是第一个)
  4. (2)中定义的函数将接收的参数数量
  5. 所以这些参数总是传递给函数

    对其进行编码的过滤器可能不是wordpress核心的一部分,而是一些自定义插件,框架或主题

    如果您想为自己的主题/插件/其他内容创建自定义查询,请查看http://codex.wordpress.org/Plugin_API/Filter_Reference/request