게시물의 성능에 대한 사용자 정의 게시물 메타 필드 효과


10

많은 사용자 정의 메타 필드가있는 게시물이 있습니다. 게시물에서을 사용하여 요구 사항에 따라 호출하고 있습니다 get_post_meta. 10 메타 필드에 대한 의미 나는 그것을 10 번 사용하고 있습니다.

내가 제대로하고 있습니까? 즉, 위의 방법에 성능 문제가 있습니까? 그렇다면 전화 수를 줄이는 방법이 있습니다.

'단일 쿼리'의 사용을 설명하는 사용자 정의 필드 및 성능 에 대한 대답을 알고 있습니다 . 그러나 누군가가 알고 세부적으로 공유하고 싶은지 다시 묻는 것은 명확하지 않고 건전하지 않습니다.

답변:


25

이것에 답하기 위해 나는 이것에 대한 몇 가지 테스트를했고 결과는 실제로 마음이 불었습니다.

여기 내 시험이있다

이를 위해 테스트 페이지를 설정하십시오. 단순히 page.php를 복사하고 이름을 바꾸고 루프를 삭제하십시오. 이제 백엔드에 새 페이지를 작성하십시오. 시작하기 전에 먼저 빈 정보로 타이머를 테스트하여 데이터없이 쿼리 양을 얻으십시오.

테스트 게시물을 위해 5 개의 메타 필드를 만들었습니다.

  • enclosure,
  • First name,
  • Last name,
  • packages
  • post_views_count

내 테스트 게시물의 ID는 530입니다. 게시물 내에서 간단히 게시물 ID를 사용 $post->ID하거나 get_the_ID()설정할 수 있습니다.

그래서 첫 테스트는 다음과 같습니다.

<?php               
       timer_start();       

       $a = get_post_meta(530, 'enclosure', true);
       $b = get_post_meta(530, 'First name', true);
       $c = get_post_meta(530, 'Last name', true);
       $d = get_post_meta(530, 'packages', true);
       $e = get_post_meta(530, 'post_views_count', true);
?>
<p><?php echo get_num_queries(); ?> queries in <?php timer_stop(1, 5); ?> seconds. </p>

그 결과는 다음과 같습니다.

0.00195 초에 1 개의 쿼리

두 번째 테스트는 다음과 같습니다.

<?php               
       timer_start();       

       $a = get_post_meta(530);
?>
<p><?php echo get_num_queries(); ?> queries in <?php timer_stop(1, 5); ?> seconds. </p>

놀랍게도 같은 결과를 냈습니다

0.00195 초에 1 개의 쿼리

당신이 보면 소스 코드 에 대한 get_post_meta(), 당신은 그 볼 get_post_meta()에 대한 단순히 래퍼입니다 get_metadata(). 그래서 이것은 당신이 볼 필요가있었습니다. 소스 코드 에 대한이 get_metadata(), 당신은 메타 데이터 캐싱되는 것을 볼 수 있습니다.

따라서 어떤 것을 사용해야하고 성능에 관한 질문에 대한 답은 귀하에게 달려 있습니다. 결과에서 증거를 보았습니다

내 개인적인 견해로는 10 개의 메타 데이터 필드 (또는 내 경우 5)를 검색 해야하는 경우 내 대답에 두 번째 접근법을 사용하십시오.

$a = get_post_meta(530);

작성하는 것이 더 빠를뿐만 아니라 코드를 반복해서는 안됩니다. 여기서 주목해야 할 또 다른 요점은 두 번째 접근 방식은 모든 메타 필드를 배열에 저장하여 매우 쉽게 액세스하고 검색 할 수 있다는 것입니다.

예를 들어, 다음은 내가하는 $a경우의 결과입니다 .var_dump( $a );

array(9) {
  ["_edit_lock"]=>
  array(1) {
    [0]=>
    string(12) "1414838328:1"
  }
  ["_edit_last"]=>
  array(1) {
    [0]=>
    string(1) "1"
  }
  ["_custom_sidebar_per_page"]=>
  array(1) {
    [0]=>
    string(7) "default"
  }
  ["post_views_count"]=>
  array(1) {
    [0]=>
    string(1) "0"
  }
  ["packages"]=>
  array(1) {
    [0]=>
    string(1) "0"
  }
  ["repeatable_names"]=>
  array(1) {
    [0]=>
    string(79) "a:1:{i:0;a:3:{s:4:"role";s:4:"fool";s:4:"name";s:6:"Pieter";s:3:"url";s:0:"";}}"
  }
  ["enclosure"]=>
  array(1) {
    [0]=>
    string(105) "http://localhost/wordpress/wp-content/uploads/2014/09/Nissan-Navara-Tough-City.avi
13218974
video/avi
"
  }
  ["First name"]=>
  array(1) {
    [0]=>
    string(3) "Tom"
  }
  ["Last name"]=>
  array(1) {
    [0]=>
    string(5) "Storm"
  }
}

다음과 같이 게시물에서 반환 된 메타 데이터에 액세스 할 수 있습니다.

echo $a['First name'][0] . " " . $a['Last name'][0] . "<br>";

어느 것이 표시 될 것인가

톰 스톰


4
이것을 '워크 워킹'이라고합니다. 훌륭한 답변입니다.
Akhilesh

1
나는 당신을 위해 일하게 된 것을 기쁘게 생각합니다. Enjoy :-)
Pieter Goosen

1
이거 좋은데. 대신 사용자 지정 사용자 메타에 중점을 둔 유사한 테스트를보고 싶습니다.
Christine Cooper

1
확실히 할 가치가 있습니다 ;-). 앞으로 며칠 안에 내가 할 수있는 일을 보게 될 것입니다. 지금 며칠 전부터 @ChristineCooper
Pieter Goosen

1
좋은! 이 스레드에서 링크가있는 태그를 지정하십시오.
Christine Cooper

0

get_post_meta모든 메타 필드 값을 한 번에 가져 오는 데 사용할 수 있습니다 .

$meta = get_post_meta( get_the_ID() );

주어진 게시물의 모든 메타 값을 가져옵니다. 개별적으로 가져 오는 대신 해당 배열을 사용하십시오.


0

Pieter Goosen이 언급했듯이 처음으로 메타 데이터를 요청하면 한 게시물의 모든 메타 데이터가 캐시됩니다.

에 대한 모든 호출에 대해서도 마찬가지입니다 WP_Query. 을 호출하자마자 WP_QueryWordPress는 검색된 모든 게시물의 메타 데이터를 단일 쿼리로 가져옵니다.

최악의 시나리오는 get_post_meta이전에 WordPress에서 검색하지 않은 개별 게시물 ID를 호출 하는 것입니다. 이 경우 호출 할 때마다 get_post_meta단일 쿼리가 발생합니다.

쿼리에서 : wp_postmeta내부 까지의 샘플 추적WP_Query

SELECT post_id, meta_key, meta_value 
    FROM wp_postmeta 
    WHERE post_id IN (491,347) 
    ORDER BY meta_id ASC

#0 /wp-includes/wp-db.php(1567): wpdb->_do_query('SELECT post_id,...')
#1 /wp-includes/wp-db.php(1958): wpdb->query('SELECT post_id,...')
#2 /wp-includes/meta.php(814): wpdb->get_results('SELECT post_id,...', 'ARRAY_A')
#3 /wp-includes/post.php(5546): update_meta_cache('post', Array)
#4 /wp-includes/post.php(5529): update_postmeta_cache(Array)
#5 /wp-includes/query.php(3614): update_post_caches(Array, 'post', true, true)
#6 /wp-includes/query.php(3836): WP_Query->get_posts()
#7 /wp-includes/query.php(3946): WP_Query->query(Array)
#8 /wp-content/plugins/***/***.php(134): WP_Query->__construct(Array)

보시다시피, 호출은 내부에서 발생 get_posts하여 2 개의 게시물에 대한 메타 데이터를 검색합니다 WP_Query. 이는 원본의 결과입니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.