jak ograniczyć wyszukiwanie do tytułów postów?

27

Czy istnieje sposób ograniczenia wyszukiwania do tytułów postów? Wiem, że mogę modyfikować plik podstawowy query.php, ale musi istnieć sposób, aby to zrobić za pomocą haków, prawda?

Z góry dziękuję!

Javier Villanueva
źródło

Odpowiedzi:

32

Oto filtr, który załatwi sprawę. Upuść go w swoim motywie functions.phplub wtyczce.

/**
 * Search SQL filter for matching against post title only.
 *
 * @link    http://wordpress.stackexchange.com/a/11826/1685
 *
 * @param   string      $search
 * @param   WP_Query    $wp_query
 */
function wpse_11826_search_by_title( $search, $wp_query ) {
    if ( ! empty( $search ) && ! empty( $wp_query->query_vars['search_terms'] ) ) {
        global $wpdb;

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

        $search = array();

        foreach ( ( array ) $q['search_terms'] as $term )
            $search[] = $wpdb->prepare( "$wpdb->posts.post_title LIKE %s", $n . $wpdb->esc_like( $term ) . $n );

        if ( ! is_user_logged_in() )
            $search[] = "$wpdb->posts.post_password = ''";

        $search = ' AND ' . implode( ' AND ', $search );
    }

    return $search;
}

add_filter( 'posts_search', 'wpse_11826_search_by_title', 10, 2 );

Większość kodu jest właśnie kopiowana z WP_Queryklasy, z wyjątkiem post_content LIKEusuniętych.

AKTUALIZACJA: Usunięto przestarzałe like_escape()od 4.0

TheDeadMedic
źródło
świetnie działa idealnie, wiedziałem, że jest do tego filtr, nie mogłem go znaleźć nigdzie w kodeksie, wielkie dzięki!
Javier Villanueva
@TheDeadMedic Właśnie wypróbowałem to na moim blogu i to konkretne zapytanie nie zwraca teraz żadnego wyniku, z tym kodem lub bez niego. Jakieś pomysły?
Ashfame,
Teraz działa jak zwykle bez kodu, ale kod nie działał dla mnie. Pokazał te same wyniki: /
Ashfame
@Ashfame Poprawiłem swoją odpowiedź.
TheDeadMedic
1
Komunikat PHP: PHP Błąd krytyczny: wywołanie niezdefiniowanej metody wpdb :: esc_like () --- Jeśli masz starszy WordPress, jest to nowa funkcja od WP 4.0
PJ Brunet