"post_title LIKE 'something %'"이있는 WP_Query?
5 대답
- 투표
-
- 2011-05-30
WP_Query
의 필터로이 문제를 해결할 것입니다.추가 쿼리 변수를 감지하고이를 제목의 접두사로 사용하는 변수입니다.add_filter( 'posts_where', 'wpse18703_posts_where', 10, 2 ); function wpse18703_posts_where( $where, &$wp_query ) { global $wpdb; if ( $wpse18703_title = $wp_query->get( 'wpse18703_title' ) ) { $where .= ' AND ' . $wpdb->posts . '.post_title LIKE \'' . esc_sql( $wpdb->esc_like( $wpse18703_title ) ) . '%\''; } return $where; }
이렇게하면
WP_Query
를 계속 호출 할 수 있습니다. 제목을wpse18703_title
인수로 전달하거나 이름을 더 짧은 이름으로 변경하면됩니다.I would solve this with a filter on
WP_Query
. One that detects an extra query variable and uses that as the prefix of the title.add_filter( 'posts_where', 'wpse18703_posts_where', 10, 2 ); function wpse18703_posts_where( $where, &$wp_query ) { global $wpdb; if ( $wpse18703_title = $wp_query->get( 'wpse18703_title' ) ) { $where .= ' AND ' . $wpdb->posts . '.post_title LIKE \'' . esc_sql( $wpdb->esc_like( $wpse18703_title ) ) . '%\''; } return $where; }
This way you can still call
WP_Query
, you just pass the title as thewpse18703_title
argument (or change the name to something shorter).-
이것은 어떻게 든`$ wpdb->prepare ()`가 누락되었습니다.This one is somehow missing the `$wpdb->prepare()`.
- 1
- 2012-11-06
- kaiser
-
@kaiser : 오랜만인데`prepare ()`로는 불가능했던 것 같아요.`$ wpdb->prepare ( 'LIKE "% s %%"','banana')`는` "LIKE ''banana '%'"`를 반환하므로 쿼리를 직접 구성하고 이스케이프도 수행해야합니다..@kaiser: It's been a long time, but I think this was not possible with `prepare()`. `$wpdb->prepare('LIKE "%s%%"', 'banana')` would return `"LIKE ''banana'%'"`, so we have to construct the query ourselves, and do the escaping too.
- 0
- 2012-11-06
- Jan Fabry
-
@JanFabry 당신을 만나서 반갑습니다 agaaaaaaaain!:) 채팅에 잠시 들러보세요,흠?StopPress는 당신을 만나서 기뻐할 것입니다.그`prepare ()`에 대해.예,그것은 까다 롭고 그것을 둘러보기 전에 여러 번 시도해야했습니다.내가 방금 만든 것에서 :`$ wpdb->prepare ( 'AND {$ wpdb->posts} .post_title LIKE % s',esc_sql ( '%'. like_escape (trim ($term)). '%'))`.그리고 나는`esc_sql ()`이 불필요하고 편집증 적이라고 확신합니다.@JanFabry Happy to see you agaaaaaaaain! :) Drop by in chat some time, hm? StopPress would be happy to see you. About that `prepare()`. Yeah, that's tricky and I had to try that several times, before I got around it. From something I just made: `$wpdb->prepare( ' AND {$wpdb->posts}.post_title LIKE %s ', esc_sql( '%'.like_escape( trim( $term ) ).'%' ) )`. And I'm pretty sure the `esc_sql()` is unnecessary and just paranoid.
- 1
- 2012-11-07
- kaiser
-
내부에` '`(아포스트로피)가있는 문자열은 검색 할 수없는 것 같습니다.탈출 때문인 것 같아요?아직 해결책을 찾지 못했습니다.It seems that you can't search a string with `'` (apostrophe) inside. I guess it's because of escaping ? I didn't find the solution yet
- 0
- 2018-08-30
- Vincent Decaux
-
- 2013-04-19
간체 :
function title_filter( $where, &$wp_query ) { global $wpdb; // 2. pull the custom query in here: if ( $search_term = $wp_query->get( 'search_prod_title' ) ) { $where .= ' AND ' . $wpdb->posts . '.post_title LIKE \'%' . esc_sql( like_escape( $search_term ) ) . '%\''; } return $where; } $args = array( 'post_type' => 'product', 'posts_per_page' => $page_size, 'paged' => $page, // 1. define a custom query var here to pass your term through: 'search_prod_title' => $search_term, 'post_status' => 'publish', 'orderby' => 'title', 'order' => 'ASC' ); add_filter( 'posts_where', 'title_filter', 10, 2 ); $wp_query = new WP_Query($args); remove_filter( 'posts_where', 'title_filter', 10 ); return $wp_query;
Simplified:
function title_filter( $where, &$wp_query ) { global $wpdb; // 2. pull the custom query in here: if ( $search_term = $wp_query->get( 'search_prod_title' ) ) { $where .= ' AND ' . $wpdb->posts . '.post_title LIKE \'%' . esc_sql( like_escape( $search_term ) ) . '%\''; } return $where; } $args = array( 'post_type' => 'product', 'posts_per_page' => $page_size, 'paged' => $page, // 1. define a custom query var here to pass your term through: 'search_prod_title' => $search_term, 'post_status' => 'publish', 'orderby' => 'title', 'order' => 'ASC' ); add_filter( 'posts_where', 'title_filter', 10, 2 ); $wp_query = new WP_Query($args); remove_filter( 'posts_where', 'title_filter', 10 ); return $wp_query;
-
코드와 함께 설명을 포함하십시오.Please include an explanation along with your code.
- 13
- 2013-04-19
- s_ha_dum
-
대단한 단순화Great simplification
- 2
- 2014-11-10
- Timo Huovinen
-
코드는 자기 설명이라고 생각합니다.완전한 스크립트를 공유해 주셔서 감사합니다.Code is i think self explained, atleast for me. Thanks for sharing complete script.
- 2
- 2017-08-08
- Hassan Dad Khan
-
'esc_sql (like_escape ('대신 '$ wpdb->esc_like (') 사용Use '$wpdb->esc_like (' instead of 'esc_sql( like_escape('
- 2
- 2018-02-19
- fdrv
-
@fdrv 당신이 맞지만 wp 문서에 따르면 $ wpdb->esc_like는 여전히esc_sql ()이 필요합니다.그래서 올바른 코드는esc_sql ($ wpdb->esc_like ($ search_term))@fdrv You are right but according to wp docs $wpdb->esc_like still need esc_sql(). So I think the correct code would be esc_sql( $wpdb->esc_like( $search_term ) )
- 0
- 2019-10-18
- Waqas Bukhary
-
`like_escape` 사용 중단 4.0.0`wpdb ::esc_like` 사용`like_escape` deprecated 4.0.0 Use `wpdb::esc_like`
- 0
- 2020-03-14
- Empty Brain
-
`remove_filter`는 3 개의 인수 만 사용하며 마지막 인수는 제거 할 수 있습니다.`remove_filter` only uses 3 arguments, the last one can be removed.
- 2
- 2020-06-24
- Skatox
-
- 2015-01-02
esc_sql ()은 4.0 이상에서 더 이상 사용되지 않으므로 워드 프레스 4.0 이상에서 작업 한이 코드를 업데이트하고 싶습니다.
function title_filter($where, &$wp_query){ global $wpdb; if($search_term = $wp_query->get( 'search_prod_title' )){ /*using the esc_like() in here instead of other esc_sql()*/ $search_term = $wpdb->esc_like($search_term); $search_term = ' \'%' . $search_term . '%\''; $where .= ' AND ' . $wpdb->posts . '.post_title LIKE '.$search_term; } return $where; }
나머지는 동일합니다.
또한 WP_Query 인수 내에서 s 변수를 사용하여 검색어를 전달할 수 있음을 지적하고 싶습니다. 그러면 내가 믿는 게시물 제목도 검색됩니다.
예 :
$args = array( 'post_type' => 'post', 's' => $search_term, 'post_status' => 'publish', 'orderby' => 'title', 'order' => 'ASC' ); $wp_query = new WP_Query($args);
Wanted to update this code you guys worked on for the wordpress 4.0 and above as esc_sql() is deprecated in 4.0 higher.
function title_filter($where, &$wp_query){ global $wpdb; if($search_term = $wp_query->get( 'search_prod_title' )){ /*using the esc_like() in here instead of other esc_sql()*/ $search_term = $wpdb->esc_like($search_term); $search_term = ' \'%' . $search_term . '%\''; $where .= ' AND ' . $wpdb->posts . '.post_title LIKE '.$search_term; } return $where; }
Rest of the stuff is same.
Also I want to point out you can use s variable within WP_Query arguments to pass search terms, which will also search for post title i believe.
Like this:
$args = array( 'post_type' => 'post', 's' => $search_term, 'post_status' => 'publish', 'orderby' => 'title', 'order' => 'ASC' ); $wp_query = new WP_Query($args);
-
정확히`search_prod_title`은 무엇입니까?이것을 다른 것으로 변경해야합니까?What exactly `search_prod_title` is? Should i change this to something else?
- 0
- 2017-03-24
- Antonios Tsimourtos
-
언제부터`esc_sql`이 사용되지 않습니까?그렇지 않습니다.`$ wpdb->escape`는 ... https://developer.wordpress.org/reference/functions/esc_sql/Since when is `esc_sql` depricated? It's not. `$wpdb->escape` is though... https://developer.wordpress.org/reference/functions/esc_sql/
- 0
- 2018-02-02
- Jeremy
-
s 매개 변수는 게시물 내용도 검색하므로 원하는 목표가 아닐 수 있습니다.=)Note that the s parameter searches the post content as well, which may not be the desired aim. =)
- 1
- 2018-04-19
- Christine Cooper
-
`like_escape`는 더 이상 사용되지 않음`4.0.0``wpdb ::esc_like` 사용`like_escape` deprecated `4.0.0` Use `wpdb::esc_like`
- 0
- 2020-03-14
- Empty Brain
-
- 2018-04-19
여기에 게시 된 취약한 솔루션과 함께 약간 단순화되고 삭제 된 버전이 제공됩니다.
먼저,특정 조건과 일치하는 게시물 만 표시 할 수있는
posts_where
필터에 대한 함수를 만듭니다.function cc_post_title_filter($where, &$wp_query) { global $wpdb; if ( $search_term = $wp_query->get( 'cc_search_post_title' ) ) { $where .= ' AND ' . $wpdb->posts . '.post_title LIKE \'%' . $wpdb->esc_like( $search_term ) . '%\''; } return $where; }
이제
cc_search_post_title
을 쿼리 인수에 추가합니다.$args = array( 'cc_search_post_title' => $search_term, // search post title only 'post_status' => 'publish', );
마지막으로 쿼리를 필터로 둘러 쌉니다.
add_filter( 'posts_where', 'cc_post_title_filter', 10, 2 ); $query = new WP_Query($args); remove_filter( 'posts_where', 'cc_post_title_filter', 10 );
get_posts () 사용
게시물을 검색하는 특정 함수는 필터를 실행하지 않으므로 첨부 한posts_where 필터 함수는 쿼리를 수정하지 않습니다.
get_posts()
를 사용하여 게시물을 쿼리하려는 경우 인수 배열에서suppress_filters
를false로 설정해야합니다.$args = array( 'cc_search_post_title' => $search_term, 'suppress_filters' => FALSE, 'post_status' => 'publish', );
이제
get_posts()
를 사용할 수 있습니다.add_filter( 'posts_where', 'cc_post_title_filter', 10, 2 ); $posts = get_posts($args); remove_filter( 'posts_where', 'cc_post_title_filter', 10 );
s
매개 변수는 어떻습니까?s
매개 변수를 사용할 수 있습니다.$args = array( 's' => $search_term, );
검색어를
s
매개 변수에 추가하면 작동하고 게시물 제목을 검색하지만 게시물 콘텐츠도 검색합니다 .WP 4.4에 추가 된
title
매개 변수는 어떻습니까?title
매개 변수에 검색어 전달 :$args = array( 'title' => $search_term, );
대소 문자를 구분하며
LIKE
가 아니라%LIKE%
입니다. 즉,hello
를 검색하면 제목이Hello World
또는Hello
인 게시물이 반환되지 않습니다.With some vulnerable solution posted here, I come with a bit simplified and sanitized version.
First, we create a function for the
posts_where
filter which allows you to only show posts matching specific conditions:function cc_post_title_filter($where, &$wp_query) { global $wpdb; if ( $search_term = $wp_query->get( 'cc_search_post_title' ) ) { $where .= ' AND ' . $wpdb->posts . '.post_title LIKE \'%' . $wpdb->esc_like( $search_term ) . '%\''; } return $where; }
Now we add
cc_search_post_title
into our query arguments:$args = array( 'cc_search_post_title' => $search_term, // search post title only 'post_status' => 'publish', );
And finally wrap the filter around the query:
add_filter( 'posts_where', 'cc_post_title_filter', 10, 2 ); $query = new WP_Query($args); remove_filter( 'posts_where', 'cc_post_title_filter', 10 );
Using get_posts()
Certain functions which retrieve posts do not run filters, so the posts_where filter functions you attach will not modify the query. If you plan to use
get_posts()
to query your posts, you need to setsuppress_filters
to false in your argument array:$args = array( 'cc_search_post_title' => $search_term, 'suppress_filters' => FALSE, 'post_status' => 'publish', );
Now you can use
get_posts()
:add_filter( 'posts_where', 'cc_post_title_filter', 10, 2 ); $posts = get_posts($args); remove_filter( 'posts_where', 'cc_post_title_filter', 10 );
What about the
s
parameter?The
s
parameter is available:$args = array( 's' => $search_term, );
While adding your search term into the
s
parameter work and it will search the post title, it will also search the post content.What about the
title
parameter which was added with WP 4.4?Passing a search term into the
title
parameter:$args = array( 'title' => $search_term, );
Is case sensitive and
LIKE
, not%LIKE%
. This mean search forhello
will not return post with titleHello World
orHello
.-
우수한.매개 변수로 'post_title'을 찾고 있었는데 분명히 아무것도 찾지 못했습니다.Excellent. I was looking for 'post_title' as a parameter and, obviously, didn't find anything.
- 0
- 2019-09-13
- MastaBaba
-
wp 쿼리에서 오류가 발생하거나 게시물을 얻습니다. "E_WARNING Errorin file»class-wp-hook.php«at line 288 : Parameter 2to cc_post_title_filter ()expectedtobe a reference,valuegivenI'm getting an error with wp query or get posts: "E_WARNING Error in file »class-wp-hook.php« at line 288: Parameter 2 to cc_post_title_filter() expected to be a reference, value given
- 0
- 2020-03-03
- Elkrat
-
@Elkrat`cc_post_title_filter`의`& $ wp_query`에서`&`를 제거합니다.@Elkrat Remove the `&` from `&$wp_query` in `cc_post_title_filter`.
- 0
- 2020-05-05
- Mattimator
-
- 2015-04-28
다른 답변을 바탕으로 메타 필드 또는 게시물 제목에 단어가 포함 된 게시물을 검색하려는 상황에서 유연성을 제공하기 위해 "title_filter_relation"인수를 통해 해당 옵션을 제공합니다. 이 구현에서는 기본값이 "AND"인 "OR"또는 "AND"입력 만 허용합니다.
function title_filter($where, &$wp_query){ global $wpdb; if($search_term = $wp_query->get( 'title_filter' )){ $search_term = $wpdb->esc_like($search_term); //instead of esc_sql() $search_term = ' \'%' . $search_term . '%\''; $title_filter_relation = (strtoupper($wp_query->get( 'title_filter_relation'))=='OR' ? 'OR' : 'AND'); $where .= ' '.$title_filter_relation.' ' . $wpdb->posts . '.post_title LIKE '.$search_term; } return $where; }
다음은 질문이 게시물 제목 자체 인 매우 간단한 게시물 유형 "faq"에 대한 작동 코드의 예입니다.
add_filter('posts_where','title_filter',10,2); $s1 = new WP_Query( array( 'post_type' => 'faq', 'posts_per_page' => -1, 'title_filter' => $q, 'title_filter_relation' => 'OR', 'post_status' => 'publish', 'orderby' => 'title', 'order' => 'ASC', 'meta_query' => array( 'relation' => 'OR', array( 'key' => 'faq_answer', 'value' => $q, 'compare' => 'LIKE' ) ) )); remove_filter('posts_where','title_filter',10,2);
Building on other answers before me, to provide flexibility in the situation where you want to search a post that contains a word in a meta field OR in the title of the post, I give that option via the argument "title_filter_relation." In this implementation, I only allow for "OR" or "AND" inputs with a default of "AND."
function title_filter($where, &$wp_query){ global $wpdb; if($search_term = $wp_query->get( 'title_filter' )){ $search_term = $wpdb->esc_like($search_term); //instead of esc_sql() $search_term = ' \'%' . $search_term . '%\''; $title_filter_relation = (strtoupper($wp_query->get( 'title_filter_relation'))=='OR' ? 'OR' : 'AND'); $where .= ' '.$title_filter_relation.' ' . $wpdb->posts . '.post_title LIKE '.$search_term; } return $where; }
Here's an example of the code in action for a very simple post type "faq" where the question is the post title itself:
add_filter('posts_where','title_filter',10,2); $s1 = new WP_Query( array( 'post_type' => 'faq', 'posts_per_page' => -1, 'title_filter' => $q, 'title_filter_relation' => 'OR', 'post_status' => 'publish', 'orderby' => 'title', 'order' => 'ASC', 'meta_query' => array( 'relation' => 'OR', array( 'key' => 'faq_answer', 'value' => $q, 'compare' => 'LIKE' ) ) )); remove_filter('posts_where','title_filter',10,2);
-
'posts_where'필터 내에서 액세스 할 수 있도록 'WP_Query'에 전달 된 쿼리 인수에 맞춤 '쿼리 변수'를 추가하는 것이 좋습니다.Good insight, adding custom "query vars" to the query args passed to `WP_Query` in order to be able to access them within the `posts_where` filter.
- 1
- 2017-02-04
- Tom Auger
WP_Query
에서LIKE
로post_title
를 수행해야합니다.이 일반
post_title
로 시작했습니다.하지만 제가 실제로하고 싶은 것은 SQL에서 다음과 같이 보입니다 :
출력은 내가 제외하고있는 결과를 인쇄하지만 일반
<?php while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
는 결과를 표시합니다.그리고
$wpdb->get_results()
에서는 작동하지 않습니다.여기에 설명 된 내용을 어떻게 달성 할 수 있습니까?