RAM 사용을 줄이기 위해 post 변수에서 내용을 제외시키는 방법이 있습니까?


9

따라서 WP RAM 사용 문제처럼 보이는 것을 찾아 해결책을 찾고 있습니다.

내 사이트에서 실제로이 문제가 발생하는 유일한 장소는 채우려는 사이트 맵 페이지뿐이지만이 문제에 대한 솔루션은 보편적으로 적용되어 전체 사이트에서 RAM 사용을 줄일 수 있습니다.

기본적으로이 사이트 맵 페이지는 전체 postspages내 사이트 의 목록입니다 . 이 페이지에서 액세스해야하는 $ post 변수의 유일한 요소는 제목과 영구 링크입니다. 불행히도, 내가 사용하는 쿼리는 각 $ post 변수에 모든 정보가 포함 된 모든 게시물을 반환합니다.

다음은이 사이트 맵 페이지에서 custom-post-type"supplements"라는 사용자 지정 분류 체계와 "all-supplements"라는 용어 가 포함 된 단일 "products" 에 대한 쿼리 예입니다 . 내 사이트 맵 페이지에는 여러 개의 쿼리가 있지만 설명을 위해이 단일 쿼리에 대한 코드 만 포함합니다.

 $varArray= array(
      'post_type' => 'products',
      'post_status' => 'publish',
      'supplements' => 'all-supplements',
      'posts_per_page' => -1,
      'orderby' => 'title',
      'order' => 'ASC'
 );
 $myProducts= new WP_Query($varArray);

$ post 변수에 저장된 대부분의 정보 (내 사이트의 경우이 추세가 일반적인 용도로 보인다고 생각됩니다)는 "콘텐츠"에서 찾을 수 있습니다. 내 사이트 맵 페이지의 일반적인 RAM 사용량은 ~ 140MB입니다. 내 사이트의 다른 일반적인 페이지의 사용량은 50-60MB입니다. 큰 차이. 어제 Site Map 페이지가 작동을 멈추고 (WSOD)이를 수정하기 위해 WP가 사용할 수있는 최대 RAM 양을 늘려야했습니다. 따라서 단일 페이지로 인해 필요한 전체 시스템 리소스를 늘리고 있습니다.

따라서 나는 내 질문에 온다.

그것이 가져올 것이라고 저는 누락 된 것을 워드 프레스 내에서 경로 / 옵션 곳이 있나요 posts/ pages일반 쿼리처럼,하지만 NOT 검색 게시물에 대한 콘텐츠를은?

또는 대안으로 전체 $ post 변수 shebang을 얻는 대신 주어진 쿼리 (Title / Permaklink / Slug / etc ...) 내에서 특정 요소 만 가져 오는 더 쉬운 방법이 있습니까?

많은 WP 응용 프로그램의 경우 게시물 / 페이지의 "콘텐츠"가 일반적으로 필요한 유일한 장소는 해당 페이지 page또는 post페이지 (여기서는 예외가 있음)이며 게시물의 전체 콘텐츠에 액세스 할 수있는 것 같습니다 다른 페이지에서 쿼리로 검색 한 / pages는 단순한 과잉입니다. 게시물 목록 페이지의 전체 컨텐츠를로드하지 않는 방법이 있으면 상당한 양의 RAM 사용량이 절약 될 수 있습니다.

도움을 주시면 감사하겠습니다.

답변:


8

메모리 사용을 줄이기 위해 전달 filter하기 sample전에 포스트 데이터를 직접 쿼리하고 포스트 오브젝트 필드를 설정하는 트릭을 시도 할 수 있습니다 get_permalink().

자세한 이유는 get_permalink 메모리 사용 문제 를 참조하십시오.


이 솔루션은 훌륭하게 작동했습니다. 글쎄, 약간의 고민 후에. :) 쿼리에 사용자 지정 분류법 / 용어를 포함시키는 방법을 알아 내야했지만 이것은 큰 도움이되었습니다. 70MB의 RAM을 사용하는 사이트 맵 페이지 (디버그 바에 따라). 훌륭한 포인터 주셔서 감사합니다.
프로그래머 Dan Dan

4

이것을 배열에 추가하려고 시도 할 수 있습니다.

'nopaging' => true,
'no_found_rows' => true,
'update_post_meta_cache' => false,
'update_post_term_cache' => false

꽤 자명 한 것처럼 보이지만 본질적으로 모든 포스트 변수와 필요한 것만 쿼리하지는 않습니다.


2

프로그래머 Dan, mah man!

전역을 SELECT사용하여 맞춤 검색어를 시작해 보겠습니다 $wpdb. 코덱스에는 사용자 지정 선택 쿼리를 사용하여 게시물 표시 에 대한 훌륭한 항목이 있습니다. 당신이 사용 한 경우 setup_postdata()를 수있는 결과를 통해 루프는 표준 워드 프레스 루프에 앉아 마치 :

global $wpdb;

$sitemap_query = "
    SELECT $wpdb->posts.ID, $wpdb->posts.post_title, $wpdb->posts.guid
    FROM $wpdb->posts
    WHERE $wpdb->posts.post_status = 'publish' 
    AND $wpdb->posts.post_type IN ('post','supplement','another_post_type')
    ORDER BY $wpdb->posts.post_type, $wpdb->posts.post_title DESC
    ";

$sitemap_nodes = $wpdb->get_results($sitemap_query, OBJECT);

if( $sitemap_nodes ):
    global $post;
    foreach ( $sitemap_nodes as $post ):
        setup_postdata( $post );
        ?>

<!-- //Use standard Wordpress template tags for SELECT'd data within The Loop here -->
    <?php the_title() ?>
    <?php the_permalink() ?>

        <?php
    endforeach;
endif;

이 쿼리는 게시물의 ID, 제목 및 GUID (게시물의 영구 링크를 결정하는 데 사용됨) 만 가져오고 다른 모든 것은 무시합니다. 그것은 또한 주문 첫번째로 결과 post_type다음 post_title, 당신은 (이론적으로 작은 성능 저하에) 게시물의 유형을 분리하기 위해 여러 쿼리를 사용 할 수 있지만.

분명히 사용을 건너 뛰고 setup_postdata()간단히 루프 스루 $sitemap_nodes하거나 쿼리를 사용하여 필요한 결과를 얻을 수 있습니다.

전화를 걸고 setup_postdata()디버그 모드를 활성화 한 경우, (고의적으로) 누락 된 정보에 관한 알림이 왼쪽과 오른쪽으로 튀어 나올 수 있습니다. @사용자 지정 쿼리가 제대로 작동하는지 확인한 후 함수 호출 전에 이를 무시하여 해당 함수를 억제 할 수 있습니다.

그러나 이것은 시작해야합니다! Codex 의 데이터베이스 설명 페이지 에서 다음 데이터베이스 다이어그램을 참조하여 조회해야하는 필드를 찾을 수 있습니다.

워드 프레스 데이터베이스 다이어그램

편집하다:

가장 효율적인 메모리 솔루션은 사용자 정의 SELECT쿼리와 @Rarst의 protip을 결합한 것입니다. :)


1

WP_Query에는 다음과 같은 "반환 필드"매개 변수가 있습니다.

$args = array(
 'fields' => 'ids'
);
$query = new WP_Query( $args );

이 방법으로 사용하면 WP_Query는 전체 게시물 개체가 아닌 게시물 ID 만 반환합니다. 그럼 당신은 바로 사용할 수 있습니다 get_permalink(), get_the_title()포스트 ID를 기반으로 콘텐츠를 검색하고, 다른 분류 된 워드 프레스의 기능을.


1
게시물의 ID를 받아들이는 함수는 대개 get_post()전체 데이터를 검색하기 위해 즉시 실행 되므로 ID를 검색하는 목적을 완전히 무시할 수 있습니다.
Rarst

1
알아 둘만 한! 나는 똑똑하다는 인상을 받았다.
Dalton
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.