이 사용자 지정 테마에서 기본 쿼리와 사용자 지정 쿼리가 어떻게 작동하는지에 대한 의문이 있습니까?


20

WordPress 테마 개발에 익숙하지 않으며 PHP에 익숙하지 않습니다 (Java 및 C #에서 왔음). 이 사용자 정의 테마 에서 다음과 같은 상황 이 있습니다.

홈페이지에서 볼 수 있듯이 우선 추천 게시물 (특정 태그를 사용하여 구현했습니다 )이 포함 된 섹션 ( evidenza 라는 Articoli) 섹션을 표시 하고 그 아래 에는 최신 게시물이 포함 된 다른 영역 ( Ultimi Articoli )이 있습니다 해당 게시물이 아닙니다.

그것을하기 위해이 코드를 사용합니다 :

<section id="blog-posts">

<header class="header-sezione">
        <h2>Articoli in evidenza</h2>
</header>

<!--<?php query_posts('tag=featured');?>-->

<?php
    $featured = new WP_Query('tag=featured');

    if ($featured->have_posts()) : 
            while ($featured->have_posts()) : $featured->the_post();
            /*
             * Include the post format-specific template for the content. If you want to
             * use this in a child theme, then include a file called called content-___.php
             * (where ___ is the post format) and that will be used instead.
             */
                 get_template_part('content', get_post_format());

             endwhile;
        wp_reset_postdata();
    else :
        // If no content, include the "No posts found" template.
        get_template_part('content', 'none');

    endif;
    ?>


<header class="header-sezione">
    <h2>Ultimi Articoli</h2>
</header>

<?php
// get the term using the slug and the tag taxonomy
$term = get_term_by( 'slug', 'featured', 'post_tag' );
// pass the term_id to tag__not_in
query_posts( array( 'tag__not_in' => array ( $term->term_id )));
?>

<?php
    if (have_posts()) :
        // Start the Loop.
        while (have_posts()) : the_post();

            /*
             * Include the post format-specific template for the content. If you want to
             * use this in a child theme, then include a file called called content-___.php
             * (where ___ is the post format) and that will be used instead.
             */
            get_template_part('content', get_post_format());

        endwhile;
    else :
        // If no content, include the "No posts found" template.
        get_template_part('content', 'none');

    endif;
    ?>

</section>

잘 작동하지만이 솔루션의 품질과 그것이 어떻게 작동하는지에 대해서는 의구심이 있습니다.

모든 주요 게시물 을 선택 하기 위해이 행을 사용 WP_Query하여 특정 태그가있는 쿼리를 정의하는 새 객체를 만듭니다 featured.

$featured = new WP_Query('tag=featured');

그런 다음 해당 have_posts()방법을 사용하여이 쿼리 결과를 반복합니다 .

그래서 내가 이해 한 바에 따르면, 이것은 WordPress 기본 쿼리가 아니지만 내가 만든 새로운 쿼리입니다. 내가 이해 한 바에 따르면 (완료된대로) 새 쿼리를 작성하는 것이 좋으며 이러한 종류의 작업을 수행하려는 경우 기본 쿼리를 사용하지 않는 것이 좋습니다.

사실입니까, 아니면 뭔가 빠졌습니까? 그것이 사실이라면, 왜 새 사용자 정의 쿼리를 작성하고 Wordpress 기본 쿼리를 수정하지 않는 것이 더 좋은지 설명 할 수 있습니까?

알았어 '기능'태그가없는 모든 게시물을 표시합니다. 이를 위해이 코드 스 니펫을 사용합니다. 반대로이 코드 스 니펫은 기본 쿼리를 수정합니다.

    <?php
    // get the term using the slug and the tag taxonomy
    $term = get_term_by( 'slug', 'featured', 'post_tag' );
    // pass the term_id to tag__not_in
    query_posts( array( 'tag__not_in' => array ( $term->term_id )));
    ?>

    <?php
        if (have_posts()) :
            // Start the Loop.
            while (have_posts()) : the_post();
                get_template_part('content', get_post_format());

            endwhile;
        else :
            // If no content, include the "No posts found" template.
            get_template_part('content', 'none');

        endif;
        ?>

제 생각에는 이것이 끔찍합니다. 사실인가요?

최신 정보:

동일한 작업을 수행하기 위해 functions.php에 추가 한이 기능 (아래 큰 답변에서)을 발견했습니다.

function exclude_featured_tag( $query ) {
    if ( $query->is_home() && $query->is_main_query() ) {
        $query->set( 'tag__not_in', 'array(ID OF THE FEATURED TAG)' );
    }
}
add_action( 'pre_get_posts', 'exclude_featured_tag' );

이 함수에는 쿼리 변수 객체가 생성 된 후 실제 쿼리가 실행되기 전에 호출되는 후크가 있습니다.

그래서 내가 이해 한 것에서 쿼리 객체를 입력 매개 변수로 가져 와서 특정 태그를 제외한 모든 게시물 (내 경우에는 featured태그 게시물) 을 선택하여 수정 (실제로 필터링)합니다.

따라서이 기능과 함께 이전 쿼리 (추천 게시물을 표시하는 데 사용 된 쿼리)를 사용하여 테마에 표시되지 않은 게시물 만 표시하려면 어떻게해야합니까? 아니면 새 검색어를 만들어야합니까?

답변:


33

실제 질문은 기본적으로 사용자 정의 쿼리를 실행하는시기와 기본 쿼리를 사용하는시기입니다. 세 부분으로 나눌 수 있습니다

1 부

맞춤 검색어를 실행하는시기 (이것은 결정적인 목록이 아닙니다)

  • 사용자 정의 컨텐츠 슬라이더를 만들려면

  • 페이지에서 추천 컨텐츠 영역을 만들려면

  • 게시물을 표시해야하는 경우 page.php 템플릿

  • 정적 프론트 페이지에 사용자 정의 컨텐츠가 필요한 경우

  • 관련, 인기 또는 정보 제공 게시물 표시

  • 기본 쿼리 범위를 벗어난 기타 보조 또는 보조 콘텐츠

기본 쿼리를 사용하는시기

기본 컨텐츠를 표시하려면

  • 홈페이지 및 백엔드에서 블로그 페이지로 설정된 페이지

  • archive.php, category.php, author.php, taxonomy.php, tag.php 및 date.php와 같은 템플릿을 포함하는 모든 아카이브 페이지

  • 업데이트 : 실제 페이지 및 정적 프론트 페이지에 사용자 정의 컨텐츠 표시 ( 실제 페이지 및 정적 프론트 페이지에서 pre_get_posts 사용 참조 )

두 번째 부분

모든 추천 게시물을 선택하려면이 줄을 사용하여 특정 태그가 표시된 검색어를 정의하는 새로운 WP_Query 객체를 만듭니다.

그래서, 내가 이해 한 바에 따르면, 이것은 WordPres 기본 쿼리가 아니라 내가 만든 새로운 쿼리입니다. 내가 이해 한 바에 따르면 새로운 쿼리를 작성하는 것이 좋으며 (이러한 것처럼) 이러한 종류의 작업을 수행하려고 할 때 기본 쿼리를 사용하지 않는 것이 좋습니다

옳은. 이것은 기본 쿼리의 범위를 벗어납니다. 기본 검색어로는 만들 수없는 보조 콘텐츠 또는 보조 콘텐츠입니다. 당신은 항상해야한다 하나를 사용 WP_Query하거나 get_posts사용자 정의 쿼리를 만들 수 있습니다.

query_posts사용자 정의 쿼리 또는 다른 쿼리를 작성하는 데 사용 하지 마십시오 . 나의 강조.

참고 : 이 기능은 플러그인이나 테마에서 사용하기위한 것이 아닙니다. 나중에 설명 하듯이 주 쿼리를 변경하는 더 나은 성능의 옵션이 있습니다. query_posts ()는 페이지의 기본 쿼리를 새 쿼리 인스턴스로 바꾸어 페이지의 기본 쿼리를 수정하는 지나치게 단순하고 문제가있는 방법입니다. 비효율적이며 (SQL 쿼리를 다시 실행) 일부 상황에서 (특히 게시물 페이지 매김을 처리 할 때 자주) 실패합니다.

계속

자, 계속해서 추천 태그가없는 모든 게시물을 표시합니다.이를 위해이 코드 스 니펫을 사용하여 반대로 기본 쿼리를 수정하십시오.

query_posts( array( 'tag__not_in' => array ( $term->term_id )));

저는 이것이 끔찍하다고 생각합니다. 사실인가요?

그게 다 잘못되었고 당신의 진술은 불행히도 사실입니다. 전에 말했듯이 절대로 사용하지 마십시오query_posts . 그것은 완전히 새로운 쿼리를 실행하는데, 이는 성능에 좋지 않으며, 대부분의 경우 페이지 매김이 올바르게 작동하기 위해 기본 쿼리의 필수적인 부분 인 페이지 매김을 중단합니다.

이것은 기본 콘텐츠이므로 기본 루프와 함께 기본 쿼리를 사용해야합니다. 기본 루프는 다음과 같아야합니다.

<?php
    if (have_posts()) :
        // Start the Loop.
        while (have_posts()) : the_post();

            get_template_part('content', get_post_format());

        endwhile;
    else :
        // If no content, include the "No posts found" template.
        get_template_part('content', 'none');

    endif;
?>

이 부분을 완전히 제거하고 삭제하고 태워 잊어 버릴 수 있습니다.

<?
// get the term using the slug and the tag taxonomy
$term = get_term_by( 'slug', 'featured', 'post_tag' );
// pass the term_id to tag__not_in
query_posts( array( 'tag__not_in' => array ( $term->term_id )));
?>

확인을 마치면 기능 태그의 게시물이 기본 쿼리 및 기본 루프를 사용하여 홈페이지에 표시됩니다.

홈페이지에서이 태그를 제거하는 올바른 방법은입니다 pre_get_posts. 이는 기본 쿼리 와 기본 콘텐츠 루프 를 변경할 때 항상 사용해야 하는 후크 를 변경 하는 올바른 방법 입니다.

따라서 코드 pre_get_posts가 정확하며 사용해야하는 기능입니다. 한 가지만, 항상 pre_get_posts백엔드를 변경 하기 때문에 관리자 페이지에 있지 않은지 확인하십시오 . 따라서 이것은 홈페이지에서 추천functions.php 태그가 지정된 게시물을 제거하는 데 사용하는 적절한 코드입니다

add_action( 'pre_get_posts', 'exclude_featured_tag' );
function exclude_featured_tag( $query ) 
{
    if (    !is_admin() 
         && $query->is_home() 
         && $query->is_main_query() 
    ) {
        $query->set( 'tag__not_in', [ID OF THE FEATURED TAG] );
    }
}

3 부

향후 도움이 될 추가 자료


천만에요. 도움이 되셨 다니 다행입니다. Enjou :-)
Pieter Goosen

와우, 정답입니다! 그래도 중요한 정보가 누락되었습니다 . 기본 게시물 페이지 외에 WP에 "이 게시물 페이지입니다"라고 알리는 방법은 무엇입니까? 카테고리가 10,11,12 인 게시물 목록과 카테고리가 13,14,15 인 다른 목록을 원한다고 가정하겠습니다. pre_get_posts를 사용하여 범주를 기본 쿼리에 삽입하는 방법을 알 수 있지만 WP가 해당 페이지를 적절한 페이지 매김이있는 게시물 목록으로 렌더링하도록하려면 어떻게해야합니까? 페이지이므로 wordpress.stackexchange.com/a/215027/74134에서 광범위한 답변을 따라야 합니까? 확실히 WordPress는 기본적으로 사이트에서 여러 블로그 목록을 허용합니까?
Mark Berry
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.