우리는 포스트 글로벌을 믿어야합니까? 여러 게시물에 응답하고 주석을

@toscho는 이 답변에 의견을 남겼 습니다. 특히 포스트 포스트 글로벌과 관련하여 글로벌 범위에서 얼마나 많은 신뢰를 가져야 $post합니까?

그래서 무엇? 검사가 실행되기 전에 모든 사람이 전역 변수를 덮어 쓸 수 있습니다. 이것이 바로 글로벌 변수의 핵심입니다 : 글로벌 액세스.

$post예를 들어 테마 자체 또는 플러그인에 의해 대부분 수정되는 전역 중 하나입니다. 또한 관련 게시물을 설정하는 등 주어진 템플릿 내의 다른 응용 프로그램에서 가장 일반적으로 사용되는 글로벌입니다.

사용자 정의 쿼리 사용으로 인해 특정 문제가있는 여러 게시물에 응답하고 주석을 달면 사용자 정의 쿼리가 재설정되지 않기 때문에 대부분의 문제가 발생합니다 (사용자 정의 쿼리는 기본 쿼리에 의해 설정된 전역을 변경합니다).

이것으로부터, $post신뢰할 수없는 것은 명백하다 . 사용자 정의 쿼리를 사용하는 잘못 작성된 코드는 $post전역을 변경하여 관련 게시물과 같은 무언가를 중단 시킬 수 있습니다 .

소수의 WordPress 개발자 만이 실제로 핵심 내부 작업에 대해 충분히 지식이 있으며 피해야 할 것과하지 말아야 할 것을 알고 있습니다. 많은 사용자가 WordPress 코어가 어떻게 작동하는지 전혀 모릅니다.

단순히 테마를 다운로드하고 플러그인을 설치하여 필요한 작업을 수행하거나 튜토리얼에서 코드를 복사하기 만하면됩니다. 단일 게시물에서 관련 게시물을 손상시키는 잘못 작성된 플러그인을 설치한다고 가정하면 그 원인을 어떻게 알 수 있습니까? 그들은 그것을 스스로 분류 할 수 있습니까, 아니면이 문제에 대해 주제 저자에게 이메일을 쓰거나이 사이트에 질문을 올리는 백 번째 사람이 될 것입니까?

내 질문 : 전역 코드 $post가 신뢰할 수 없을 때 가져온 다른 코드로 인한 문제를 어떻게 방지 할 수 있습니까? 우리 $post는 전혀 글로벌을 사용해야합니까 ? 대안은 무엇입니까?

사용 중 (도 일부 테마와 플러그인에서 볼 수) 나는 생각했다 : 그냥 내가 결론을 여기 전에 내 마음을 공유 wp_reset_postdata()또는 wp_reset_query()사용하기 전에 $post, 글로벌 메인 쿼리로 재설정되고하는지 확인하십시오 $post. 그러나 다른 사람이 자신의 플러그인을 올바르게 코딩하지 않았기 때문에 왜 테마에 내 코드를 부풀려 야합니까? 그리고 누군가 사용자 정의 쿼리를 올바르게 재설정 한 경우이 작업은 두 번째로 불필요하게 실행되므로 좋지 않습니다.

내가 생각한 두 번째 방법은를 사용 $wp_query하고 다음과 같은 방법을 사용하는 것 $wp_query->post입니다.

이에 대한 모든 의견을 부탁드립니다.



답변

만약 당신이 확신 할 수 없다 : 슬픈 진실은이 일부 코드가 중단되지 않습니다 당신의 코드를, 그리고이없는 것도 당신이를 방지하기 위해 할 수있는가. 특히 모든 것이 전세계 인 WordPress에서 .

즉 예, 세계는 말했다 $post특별 사용하여 가장 많이 사용 글로벌 VAR 중 하나입니다 주의 는 위해 가 될 수 있는 좋은 아이디어입니다.

내 코드에서는 거의 전역에 직접 액세스하지 않습니다 $post.

단일 콘테스트에 참여할 때 get_queried_object()일반적으로 $post유효한 WP_Post인스턴스 인지 확인 합니다.

$post = get_queried_object();

if ( ! $post instanceof \WP_Post ) {
   die( 'What the f**k?!' );
}

드물게 $post직접 액세스하는 경우에도 확인 합니다.

get_queried_object()일부 코드가를 사용하면 예기치 않은 값 을 반환 query_posts하지만 누군가가에 의존하는 코드를 사용 query_posts하는 경우 사이트가 중단되면 가치가 있음을 고려하십시오. 🙂

또한 일부 조건이 필요한 경우 특정 게시물 유형 또는 특정 상태와 같은 조건을 확인합니다.

더 많은 검사가 필요하면 더 많은 장소에서 검사를 수행하는 기능을 만듭니다.

function get_global_post() {
    global $post;
    if (
        ! $post instanceof \WP_Post
        || ! $post->post_type === 'mycpt'
        || ! in_array( $post->post_status, array( 'publish', 'private' ), true )
    ) {
        return false;
    }
    return $post;
}

$mypost = get_global_post();

if ( ! $mypost ) {
      die( 'What the f**k?!' );
}

사용자 정의 쿼리 내부에서 루핑하는 동안 호출 the_post()하면 게시 객체가 재설정되므로 괜찮습니다. 그런 다음 wp_reset_postdata()사용자 정의 쿼리 를 호출하는 것은 내 책임 입니다. 물론 그렇게합니다 🙂