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


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.