WP_query (), query_posts () 및 pre_get_posts를 사용하는 경우
-
-
[언제 WP \ _Query vs query \ _posts () vsget \ _posts ()?] (http://wordpress.stackexchange.com/questions/1753/when-should-you-use-wp-쿼리 대 쿼리 게시물 대get-posts)Possible duplicate of [When should you use WP\_Query vs query\_posts() vs get\_posts()?](http://wordpress.stackexchange.com/questions/1753/when-should-you-use-wp-query-vs-query-posts-vs-get-posts)
- 4
- 2016-01-03
- dotancohen
-
@saltcod,이제는 다릅니다. WordPress가 진화했습니다. [여기] (http://wordpress.stackexchange.com/questions/50761/when-to-use-wp-query-query-post-and-pre-get-posts/250523 # 250523).@saltcod, now is different, WordPress evolved, I added few comments in comparison to the accepted answer [here](http://wordpress.stackexchange.com/questions/50761/when-to-use-wp-query-query-posts-and-pre-get-posts/250523#250523).
- 0
- 2016-12-28
- prosti
-
5 대답
- 투표
-
- 2012-05-01
다음과 같이 말하는 것이 옳습니다.
<인용구>더 이상
query_posts
를 사용하지 않습니다.pre_get_posts
pre_get_posts
는 모든 쿼리. '주 쿼리'만 변경하는 데 가장 자주 사용됩니다.add_action('pre_get_posts','wpse50761_alter_query'); function wpse50761_alter_query($query){ if( $query->is_main_query() ){ //Do something to main query } }
(
is_admin()
이 false 를 반환하는지 확인합니다. 이는 중복 될 수 있습니다.) 기본 검색어는 템플릿에 다음과 같이 표시됩니다.if( have_posts() ): while( have_posts() ): the_post(); //The loop endwhile; endif;
이 루프를 편집해야 할 필요가 있다면
pre_get_posts
를 사용하세요. 즉,query_posts()
를 사용하고 싶다면pre_get_posts
를 대신 사용하세요.WP_ 쿼리
기본 쿼리는
WP_Query object
의 중요한 인스턴스입니다. 예를 들어 WordPress는이를 사용하여 사용할 템플릿을 결정하고 url (예 : 페이지 매김)에 전달 된 인수는 모두WP_Query
개체의 해당 인스턴스로 전달됩니다.보조 루프 (예 : 사이드 바 또는 '관련 게시물'목록)의 경우
WP_Query
개체의 고유 한 인스턴스를 만드는 것이 좋습니다. 예 :$my_secondary_loop = new WP_Query(...); if( $my_secondary_loop->have_posts() ): while( $my_secondary_loop->have_posts() ): $my_secondary_loop->the_post(); //The secondary loop endwhile; endif; wp_reset_postdata();
알림
wp_reset_postdata();
-2 차 루프가 '현재 게시물'을 식별하는 전역$post
변수를 재정의하기 때문입니다. 이것은 본질적으로 우리가있는$post
로 재설정합니다.get_posts ()
이것은 본질적으로
WP_Query
개체의 개별 인스턴스에 대한 래퍼입니다. 이것은 포스트 객체의 배열을 반환합니다. 위의 루프에서 사용 된 메서드는 더 이상 사용할 수 없습니다. 이것은 '루프'가 아니라 단순히 포스트 객체의 배열입니다.<ul> <?php global $post; $args = array( 'numberposts' => 5, 'offset'=> 1, 'category' => 1 ); $myposts = get_posts( $args ); foreach( $myposts as $post ) : setup_postdata($post); ?> <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php endforeach; wp_reset_postdata(); ?> </ul>
귀하의 질문에 대한 답변
-
pre_get_posts
를 사용하여 기본 검색어를 변경합니다. 템플릿 페이지의 보조 루프에 대해 별도의WP_Query
개체 (방법 2)를 사용합니다. - 기본 루프의 쿼리를 변경하려면
pre_get_posts
를 사용하세요.
You are right to say:
Never use
query_posts
anymorepre_get_posts
pre_get_posts
is a filter, for altering any query. It is most often used to alter only the 'main query':add_action('pre_get_posts','wpse50761_alter_query'); function wpse50761_alter_query($query){ if( $query->is_main_query() ){ //Do something to main query } }
(I would also check that
is_admin()
returns false - though this may be redundant.). The main query appears in your templates as:if( have_posts() ): while( have_posts() ): the_post(); //The loop endwhile; endif;
If you ever feel the need to edit this loop - use
pre_get_posts
. i.e. If you are tempted to usequery_posts()
- usepre_get_posts
instead.WP_Query
The main query is an important instance of a
WP_Query object
. WordPress uses it to decide which template to use, for example, and any arguments passed into the url (e.g. pagination) are all channelled into that instance of theWP_Query
object.For secondary loops (e.g. in side-bars, or 'related posts' lists) you'll want to create your own separate instance of the
WP_Query
object. E.g.$my_secondary_loop = new WP_Query(...); if( $my_secondary_loop->have_posts() ): while( $my_secondary_loop->have_posts() ): $my_secondary_loop->the_post(); //The secondary loop endwhile; endif; wp_reset_postdata();
Notice
wp_reset_postdata();
- this is because the secondary loop will override the global$post
variable which identifies the 'current post'. This essentially resets that to the$post
we are on.get_posts()
This is essentially a wrapper for a separate instance of a
WP_Query
object. This returns an array of post objects. The methods used in the loop above are no longer available to you. This isn't a 'Loop', simply an array of post object.<ul> <?php global $post; $args = array( 'numberposts' => 5, 'offset'=> 1, 'category' => 1 ); $myposts = get_posts( $args ); foreach( $myposts as $post ) : setup_postdata($post); ?> <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php endforeach; wp_reset_postdata(); ?> </ul>
In response to your questions
- Use
pre_get_posts
to alter your main query. Use a separateWP_Query
object (method 2) for secondary loops in the template pages. - If you want to alter the query of the main loop, use
pre_get_posts
.
-
그렇다면 WP_Query가 아닌get_posts ()로 곧장 갈 시나리오가 있습니까?So is there any scenario when one would go straight to get_posts() rather than WP_Query?
- 0
- 2012-08-25
- urok93
-
@drtanz-네.예를 들어 페이지 매김이나 상단에 고정 게시물이 필요하지 않다고 가정 해 보겠습니다.이 경우`get_posts ()`가 더 효율적입니다.@drtanz - yes. Say for instance you don't need pagination, or sticky posts at the top - in these instances `get_posts()` is more efficient.
- 0
- 2012-08-25
- Stephen Harris
-
하지만 기본 쿼리를 수정하기 위해pre_get_posts를 수정할 수있는 추가 쿼리가 추가되지 않을까요?But wouldn't that add an extra query where we could just modify pre_get_posts to modify the main query?
- 1
- 2012-08-26
- urok93
-
@drtanz-기본 쿼리에`get_posts ()`를 사용하지 않을 것입니다. 보조 쿼리에 사용합니다.@drtanz - you wouldn't be using `get_posts()` for the main query - its for secondary queries.
- 0
- 2012-08-26
- Stephen Harris
-
WP_Query 예제에서 $my_secondary_loop->the_post ();to $my_post=$my_secondary_loop->next_post ();$my_post를 사용하여 필요한 작업을 수행하는 한 wp_reset_postdata () 사용을 기억할 필요가 없습니다.In your WP_Query example, if you change $my_secondary_loop->the_post(); to $my_post = $my_secondary_loop->next_post(); you can avoid having to remember to use wp_reset_postdata() as long as you use $my_post to do what you need to do.
- 0
- 2015-09-18
- Privateer
-
@Privateer 그렇지 않습니다.`WP_Query ::get_posts ()`는`global $post;`를 설정합니다.@Privateer Not so, `WP_Query::get_posts()` sets `global $post;`
- 0
- 2015-09-19
- Stephen Harris
-
@StephenHarris 방금 쿼리 클래스를 살펴 보았지만 보이지 않습니다.나는 항상 이런 식으로 쿼리를 수행하기 때문에 wp_reset_postdata를 사용하지 않기 때문에 주로 확인했습니다.새 개체를 만들고 있으며 모든 결과가 그 안에 포함됩니다.@StephenHarris I just looked through the query class and don't see it. I checked mostly because I never use wp_reset_postdata because I always do queries this way. You are creating a new object and all of the results are contained within it.
- 0
- 2015-09-19
- Privateer
-
@Privateer-죄송합니다,오타,`WP_Query ::the_post ()`,참조 : https://github.com/WordPress/WordPress/blob/759f3d894ce7d364cf8bfc755e483ac2a6d85653/wp-includes/query.php#L3732@Privateer - sorry, typo, `WP_Query::the_post()`, see: https://github.com/WordPress/WordPress/blob/759f3d894ce7d364cf8bfc755e483ac2a6d85653/wp-includes/query.php#L3732
- 0
- 2015-09-19
- Stephen Harris
-
@StephenHarris Right=)the_post를 사용하는 대신 객체에서next_post ()를 사용하면 전역 쿼리를 수행하지 않고 나중에 wp_reset_postdata를 사용하는 것을 기억할 필요가 없습니다.@StephenHarris Right =) If you use next_post() on the object instead of using the_post, you don't step on the global query and don't need to remember to use wp_reset_postdata afterwards.
- 2
- 2015-09-19
- Privateer
-
@Privateer 아,사과드립니다.당신이 옳습니다 (그러나 당신은 전역`$post`를 참조하는 어떤 함수도 사용할 수 없을 것입니다. 예 :`the_title ()`,`the_content ()`).@Privateer Ah, my apologies, seemed to have confused myself. You are right (but you would not be able to use any functions which refer to the global `$post` e.g. `the_title()`, `the_content()`).
- 0
- 2015-09-23
- Stephen Harris
-
True=) 나는 그것들을 절대 사용하지 않기 때문에 놓치지 않습니다.True =) I never use any of those so I don't miss them.
- 0
- 2015-09-24
- Privateer
-
@ urok93 특히 ACF 관련 게시물을 받아야 할 때 가끔`get_posts ()`가 있습니다.내 템플릿을 표준화하려고 생각했는데 WP_Query 인스턴스로 다시 작성하는 것을 고려하고 있습니다.@urok93 I sometimes `get_posts()` when I need to get ACF related posts, especially if there's only one. Thought to standardize my templates I'm considering rewriting them as WP_Query instances.
- 0
- 2018-02-14
- Slam
-
- 2012-05-01
루프에는 두 가지 컨텍스트가 있습니다.
- URL 요청에 따라 발생하고 템플릿이로드되기 전에 처리되는 기본 루프
- 템플릿 파일 등에서 호출되는 다른 방식으로 발생하는 보조 루프
query_posts ()
의 문제는 메인 루프가 되려고 시도하고 비참하게 실패하는 2 차 루프라는 것입니다. 따라서 존재한다는 사실을 잊어 버리십시오.메인 루프 수정
-
query_posts ()
를 사용하지 마십시오. -
$ query- >is_main_query ()
검사와 함께pre_get_posts
필터 사용 - 또는
request
필터를 사용합니다 (약간 너무 거칠어 서 위가 더 좋습니다).
2 차 루프 실행
대부분 상호 교환 가능한
new WP_Query
또는get_posts ()
를 사용합니다 (후자는 전자의 경우 얇은 래퍼).정리
query_posts ()
를 사용했거나 전역$ wp_query
를 직접 엉망으로 만든 경우wp_reset_query ()
를 사용하므로 거의 필요하지 않습니다.the_post ()
또는setup_postdata ()
를 사용했거나 전역$post
wp_reset_postdata () 를 사용합니다. > 사후 관련 사항의 초기 상태를 복원해야합니다.There are two different contexts for loops:
- main loop that happens based on URL request and is processed before templates are loaded
- secondary loops that happen in any other way, called from template files or otherwise
Problem with
query_posts()
is that it is secondary loop that tries to be main one and fails miserably. Thus forget it exists.To modify main loop
- don't use
query_posts()
- use
pre_get_posts
filter with$query->is_main_query()
check - alternately use
request
filter (a little too rough so above is better)
To run secondary loop
Use
new WP_Query
orget_posts()
which are pretty much interchangeable (latter is thin wrapper for former).To cleanup
Use
wp_reset_query()
if you usedquery_posts()
or messed with global$wp_query
directly - so you will almost never need to.Use
wp_reset_postdata()
if you usedthe_post()
orsetup_postdata()
or messed with global$post
and need to restore initial state of post-related things.-
Rarst는`wp_reset_postdata ()`를 의미했습니다.Rarst meant `wp_reset_postdata()`
- 4
- 2012-06-01
- Gregory
-
- 2012-09-16
query_posts ($ query)
사용에 대한 합법적 인 시나리오가 있습니다. 예를 들면 다음과 같습니다.-
페이지 템플릿을 사용하여 페이지에 게시물 목록 또는 맞춤 게시물 유형 게시물을 표시하려는 경우
-
그 게시물의 페이지 매김이 작동하도록하려는 경우
이제 아카이브 템플릿을 사용하는 대신 페이지에 표시하려는 이유는 무엇입니까?
-
관리자 (귀하의 고객이십니까?)에게 더 직관적입니다. '페이지'에서 페이지를 볼 수 있습니다.
-
메뉴에 추가하는 것이 더 좋습니다 (페이지없이 URL을 직접 추가해야 함).
-
템플릿에 추가 콘텐츠 (텍스트,게시물 미리보기 이미지 또는 사용자 지정 메타 콘텐츠)를 표시하려는 경우 페이지에서 쉽게 가져올 수 있습니다 (모두 고객에게 더 적합 함). 아카이브 템플릿을 사용했는지 확인하세요. 추가 콘텐츠를 하드 코딩하거나 예를 들어 테마/플러그인 옵션을 사용해야합니다 (고객에게 덜 직관적 임).
다음은 페이지 템플릿에있는 간단한 예제 코드입니다 (예 :page-page-of-posts.php).
/** * 템플릿 이름 : 게시물 페이지 */ while (have_posts ()) {//원래 메인 루프-페이지 콘텐츠 the_post (); 제목();//페이지 제목 the_content ();//페이지 내용 //기타 ... } //이제 사용자 정의 포스트 유형 게시물 목록을 표시합니다. //먼저 페이지 매김 매개 변수를 얻습니다. $paged=1; if (get_query_var ( 'paged')) { $paged=get_query_var ( 'paged'); }elseif (get_query_var ( 'page')) { $paged=get_query_var ( '페이지'); } //게시물을 쿼리하고 기본 쿼리 (페이지)를이 쿼리 (페이지 매김 작동)로 바꿉니다. query_posts (array ( 'post_type'=> 'my_post_type','post_status'=> 'publish','paged'=> $paged)); //페이지 매김 next_posts_link (); previous_posts_link (); //루프 while (have_posts ()) { the_post (); 제목();//맞춤 게시물 유형 게시물의 제목 the_content ();////맞춤 게시물 유형 게시물의 콘텐츠 } wp_reset_query ();//기본 쿼리 (글로벌 $ wp_query)를 원래 페이지 쿼리 (글로벌 $ wp_the_query 변수에서 가져옴)로 설정하고 게시 데이터를 재설정합니다. //이제 페이지 관련 콘텐츠를 다시 표시 할 수 있습니다 (원하는 경우). while (have_posts ()) {//원래 메인 루프-페이지 콘텐츠 the_post (); 제목();//페이지 제목 the_content ();//페이지 내용 //기타 ... }
자,여기서도
<사전> <코드> //... 글로벌 $ wp_query; $ wp_query=new WP_Query (array ( 'your query vars here'));//새 맞춤 쿼리를 기본 쿼리로 설정 //여기에 사용자 정의 포스트 유형 루프 wp_reset_query (); //...query_posts ()
사용을 피하고 대신WP_Query
를 사용할 수 있습니다.-다음과 같이 :하지만 그토록 멋진 작은 기능을 사용할 수 있는데 왜 그렇게할까요?
There are legitimate scenarios for using
query_posts($query)
, for example:You want to display a list of posts or custom-post-type posts on a page (using a page template)
You want to make pagination of those posts work
Now why would you want to display it on a page instead of using an archive template?
It's more intuitive for an administrator (your customer?) - they can see the page in the 'Pages'
It's better for adding it to menus (without the page, they'd have to add the url directly)
If you want to display additional content (text, post thumbnail, or any custom meta content) on the template, you can easily get it from the page (and it all makes more sense for the customer too). See if you used an archive template, you'd either need to hardcode the additional content or use for example theme/plugin options (which makes it less intuitive for the customer)
Here's a simplified example code (which would be on your page template - e.g. page-page-of-posts.php):
/** * Template Name: Page of Posts */ while(have_posts()) { // original main loop - page content the_post(); the_title(); // title of the page the_content(); // content of the page // etc... } // now we display list of our custom-post-type posts // first obtain pagination parametres $paged = 1; if(get_query_var('paged')) { $paged = get_query_var('paged'); } elseif(get_query_var('page')) { $paged = get_query_var('page'); } // query posts and replace the main query (page) with this one (so the pagination works) query_posts(array('post_type' => 'my_post_type', 'post_status' => 'publish', 'paged' => $paged)); // pagination next_posts_link(); previous_posts_link(); // loop while(have_posts()) { the_post(); the_title(); // your custom-post-type post's title the_content(); // // your custom-post-type post's content } wp_reset_query(); // sets the main query (global $wp_query) to the original page query (it obtains it from global $wp_the_query variable) and resets the post data // So, now we can display the page-related content again (if we wish so) while(have_posts()) { // original main loop - page content the_post(); the_title(); // title of the page the_content(); // content of the page // etc... }
Now, to be perfectly clear, we could avoid using
query_posts()
here too and useWP_Query
instead - like so:// ... global $wp_query; $wp_query = new WP_Query(array('your query vars here')); // sets the new custom query as a main query // your custom-post-type loop here wp_reset_query(); // ...
But, why would we do that when we have such a nice little function available for it?
-
브라이언,감사합니다.나는 당신이 설명하는 시나리오와 똑같이pre_get_posts가 페이지에서 작동하도록 고군분투했습니다. 클라이언트는 그렇지 않으면 아카이브 페이지가 될 사용자 정의 필드/콘텐츠를 추가해야하므로 "페이지"를 만들어야합니다.클라이언트는 사용자 정의 링크를 추가하면 이스케이프되므로 탐색 메뉴에 추가 할 내용이 표시되어야합니다.나에게서 +1!Brian, thanks for that. I've been struggling to get pre_get_posts to work on a page in EXACTLY the scenario you describe: client needs to add custom fields/content to what otherwise would be an archive page, so a "page" needs to be created; client needs to see something to add to nav menu, as adding a custom link escapes them; etc. +1 from me!
- 2
- 2012-12-13
- Will Lanni
-
"pre_get_posts"를 사용하여 수행 할 수도 있습니다.나는 사용자 정의 순서와 사용자 정의 필터를 사용하여 내 사용자 정의 게시물 유형을 나열하는 "정적 프론트 페이지"를 갖도록했습니다.이 페이지도 페이지가 매겨져 있습니다.작동 방식을 보려면이 질문을 확인하십시오. http://wordpress.stackexchange.com/questions/30851/how-to-use-a-custom-post-type-archive-as-front-page/30854 간단히 말해서 query_posts를 사용하는 합법적 인 시나리오는 아직 없습니다.)That can also be done using "pre_get_posts". I did that to have a "static front page" listing my custom post types in a custom order and with a custom filter. This page is also paginated. Check out this question to see how it works: http://wordpress.stackexchange.com/questions/30851/how-to-use-a-custom-post-type-archive-as-front-page/30854 So in short, there is still no more legitimate scenario for using query_posts ;)
- 3
- 2015-01-12
- 2ndkauboy
-
"이를 사용하여 페이지의 기본 쿼리를 대체하면 페이지 로딩 시간이 늘어날 수 있기 때문에 최악의 시나리오에서는 필요한 작업량을 두 배 이상 늘릴 수 있습니다. 사용하기 쉽지만 기능도 혼동되기 쉽습니다.그리고 나중에 문제. "출처 http://codex.wordpress.org/Function_Reference/query_postsBecause "It should be noted that using this to replace the main query on a page can increase page loading times, in worst case scenarios more than doubling the amount of work needed or more. While easy to use, the function is also prone to confusion and problems later on." Source http://codex.wordpress.org/Function_Reference/query_posts
- 2
- 2015-03-09
- Claudiu Creanga
-
이 대답은 모든 종류의 잘못된 것입니다.사용자 지정 게시물 유형과 동일한 URL을 사용하여 WP에서 "페이지"를 만들 수 있습니다.예를 들어 CPT가 Bananas이면 동일한 URL을 가진 Bananas라는 페이지를 얻을 수 있습니다.그런 다음 siteurl.com/bananas로 끝납니다.테마 폴더에 archive-bananas.php가있는 한 템플릿을 사용하고 대신 해당 페이지를 "무시"합니다.다른 의견 중 하나에서 언급했듯이이 "방법"을 사용하면 WP에 대한 작업 부하가 두 배가되므로 사용해서는 안됩니다.THis answer is all kinds of wrong. You can create a "Page" in WP with the same URL as the Custom post type. EG if your CPT is Bananas, you can get a page named Bananas with the same URL. Then you'd end up with siteurl.com/bananas. As long as you have archive-bananas.php in your theme folder, then it will use the template and "override" that page instead. As stated in one of the other comments, using this "method" creates twice the workload for WP, thus should NOT ever be used.
- 0
- 2015-06-19
- Hybrid Web Dev
-
- 2015-01-23
functions.php에서 WordPress 쿼리를 수정합니다.
//unfortunately, "IS_PAGE" condition doesn't work in pre_get_posts (it's WORDPRESS behaviour) //so you can use `add_filter('posts_where', ....);` OR modify "PAGE" query directly into template file add_action( 'pre_get_posts', 'myFunction' ); function myFunction($query) { if ( ! is_admin() && $query->is_main_query() ) { if ( $query->is_category ) { $query->set( 'post_type', array( 'post', 'page', 'my_postType' ) ); add_filter( 'posts_where' , 'MyFilterFunction_1' ) && $GLOBALS['call_ok']=1; } } } function MyFilterFunction_1($where) { return (empty($GLOBALS['call_ok']) || !($GLOBALS['call_ok']=false) ? $where : $where . " AND ({$GLOBALS['wpdb']->posts}.post_name NOT LIKE 'Journal%')"; }
I modify WordPress query from functions.php:
//unfortunately, "IS_PAGE" condition doesn't work in pre_get_posts (it's WORDPRESS behaviour) //so you can use `add_filter('posts_where', ....);` OR modify "PAGE" query directly into template file add_action( 'pre_get_posts', 'myFunction' ); function myFunction($query) { if ( ! is_admin() && $query->is_main_query() ) { if ( $query->is_category ) { $query->set( 'post_type', array( 'post', 'page', 'my_postType' ) ); add_filter( 'posts_where' , 'MyFilterFunction_1' ) && $GLOBALS['call_ok']=1; } } } function MyFilterFunction_1($where) { return (empty($GLOBALS['call_ok']) || !($GLOBALS['call_ok']=false) ? $where : $where . " AND ({$GLOBALS['wpdb']->posts}.post_name NOT LIKE 'Journal%')"; }
-
이 예제를보고 싶지만 where 절이 사용자 지정 메타에 있습니다.would be interested to see this example but where clause is on custom meta.
- 0
- 2017-03-03
- Andrew Welch
-
- 2016-12-28
워드 프레스가 시간이 지남에 따라 발전하고 몇 가지 사항이 현재 (5 년 후) 달라진 이후 수용된 답변에 대한 몇 가지 개선 사항을 간략하게 설명합니다.
<인용구>pre_get_posts
는 쿼리를 변경하기위한 필터입니다. '주 쿼리'만 변경하는 데 가장 자주 사용됩니다.사실 액션 훅입니다. 필터가 아니며 모든 쿼리에 영향을 미칩니다.
<인용구>기본 검색어는 다음과 같이 템플릿에 표시됩니다.
if( have_posts() ): while( have_posts() ): the_post(); //The loop endwhile; endif;
사실 이것도 사실이 아닙니다.
have_posts
함수는 기본 쿼리와 만 관련되지 않은global $wp_query
개체를 반복합니다.global $wp_query;
는 보조 쿼리로도 변경 될 수 있습니다.function have_posts() { global $wp_query; return $wp_query->have_posts(); }
get_posts ()
이것은 본질적으로 WP_Query 객체의 개별 인스턴스에 대한 래퍼입니다.
사실 요즘은
<시간>WP_Query
가 클래스이므로 클래스의 인스턴스가 있습니다.결론 : @StephenHarris가 작성했을 때이 모든 것이 사실 일 가능성이 높지만 시간이지나면서 WordPress의 내용이 변경되었습니다.
Just to outline some improvements to the accepted answer since WordPress evolved over the time and some things are different now (five years later):
pre_get_posts
is a filter, for altering any query. It is most often used to alter only the 'main query':Actually is an action hook. Not a filter, and it will affect any query.
The main query appears in your templates as:
if( have_posts() ): while( have_posts() ): the_post(); //The loop endwhile; endif;
Actually, this is also not true. The function
have_posts
iterates theglobal $wp_query
object that is not related only to the main query.global $wp_query;
may be altered with the secondary queries also.function have_posts() { global $wp_query; return $wp_query->have_posts(); }
get_posts()
This is essentially a wrapper for a separate instance of a WP_Query object.
Actually, nowadays
WP_Query
is a class, so we have an instance of a class.
To conclude: At the time @StephenHarris wrote most likely all this was true, but over the time things in WordPress have been changed.
-
기술적으로는 모든 필터가 내부에 있고 액션은 단순한 필터 일뿐입니다.하지만 여기에서 맞습니다. 참조로 인수를 전달하는 동작입니다. 이것이 더 단순한 동작과 다른 점입니다.Technically, it's all filters under the hood, actions are just a simple filter. But you are correct here, it's an action that passes an argument by reference, which is how it differs from more simple actions.
- 0
- 2016-12-28
- Milo
-
`get_posts`는`WP_Query` 객체가 아닌 포스트 객체의 배열을 반환하므로 여전히 정확합니다.그리고`WP_Query`는 항상 클래스,클래스=객체의 인스턴스였습니다.`get_posts` returns an array of post objects, not a `WP_Query` object, so that is indeed still correct. and `WP_Query` has always been a class, instance of a class = object.
- 0
- 2016-12-28
- Milo
-
고마워,@Milo,어떤 이유로 내 머리 속에 모델을 지나치게 단순화했습니다.Thanks, @Milo, correct from some reason I had oversimplified model in my head.
- 0
- 2016-12-28
- prosti
@nacin 쿼리를 알지 못합니다 어제 질문을 던지는 토끼 구멍을 보냈습니다. 어제 이전에는 모두에게
query_posts()
를 (잘못) 사용했습니다. 내 쿼리가 필요합니다. 이제WP_Query()
사용에 대해 조금 더 현명 해졌습니다. 하지만 여전히 회색 영역이 있습니다.확실히 알고있는 것 :
사이드 바,바닥 글,모든 종류의 "관련 게시물"등 페이지의 어느 곳에서나 추가 루프를 만드는 경우
WP_Query()
. 한 페이지에 아무 문제없이 반복해서 사용할 수 있습니다. (권리?).확실하지 않은 사항
pre_get_posts
및WP_Query()
? 지금 모든 작업에pre_get_posts
를 사용해야합니까?if have_posts : while have_posts : the_post
부분을 제거하고 직접 < a href="http://codex.wordpress.org/Function_Reference/WP_Query"rel="noreferrer">WP_Query()
? 또는 내 함수에서pre_get_posts
를 사용하여 출력을 수정합니까? PHP 파일?tl; dr
여기에서 도출하고 싶은tl; dr 규칙은 다음과 같습니다.
query_posts
를 사용하지 않습니다.WP_Query()
지혜 감사합니다
테리
ps :보고 읽었습니다 : WP_Query 대 query_posts () 대get_posts ()는 언제 사용해야합니까? 다른 차원을 추가하는 —
get_posts
. 그러나pre_get_posts
는 전혀 다루지 않습니다.