사용자 정의 필드 키 (크로스 포스트)에 대한 모든 값 가져 오기


44

특정 게시물에 대한 사용자 정의 필드 값을 얻는 방법을 알고 있습니다.

get_post_meta($post_id, $key, $single);

내가 필요한 것은 모든 게시물 에서 특정 사용자 정의 게시물 키와 관련된 모든 값을 얻는 입니다.

효율적인 방법을 아는 사람이 있습니까? DB의 모든 게시물 ID를 반복하고 싶지 않습니다.

예:

4는 'Mood'라는 사용자 정의 필드에 대해 다른 값을 가진 모든 게시물을 게시합니다. 2 개의 게시물은 'happy', 1 개의 게시물은 'angry', 1 개의 게시물은 'sad'입니다.

나는 출력하고 싶다 : 우리가 가진 모든 게시물에서 : 두 명의 행복하고, 화난 사람과 슬픈 작가.

그러나 많은 게시물이 있습니다.

내가 찾고있는 것은 다음 중 하나입니다.

  • 이것을 얻는 WP 함수. 또는
  • 이를 가능한 한 효율적으로 얻는 사용자 정의 쿼리.

5
이것을 분류법으로 사용하는 것 같습니다. 저장할 때 이러한 게시물에 단순히 (자동으로) 용어를 추가하지 않는 이유는 무엇입니까? 쿼리가 훨씬 쉬워집니다.
카이저

@kaiser 천재가되어 주셔서 감사합니다!
user2128576

답변:


58

가능한 방법 중 하나는 WPDB 클래스의 도우미 메소드 중 하나를 사용하여보다 세련된 메타 기반 쿼리를 수행하는 것입니다. 그러나 이러한 함수 중 일부를 사용하는 경우 한 가지 열이나 행만 호출하더라도 일반적으로 간단한 데이터 배열을 다시 가져 오지 않고 일반적으로 객체 속성을 불필요하게 참조해야한다는 점에주의해야합니다.

물론, 모든 함수가 동일하고 동일한 것은 아니며 , 의도적 인 언급은 WPDB 메소드로 보내집니다.이 메소드 get_col는 쿼리 된 데이터의 단순한 평면 배열을 반환합니다. 다음 예제는이 메소드를 호출하기 때문에 특별히 언급합니다. .

WordPress-WPDB 데이터 열 선택
$ wpdb-> get_col ()

다음은 선택된 게시물 유형, 게시물 상태 및 특정 메타 키 (또는 기술적으로 신경 쓰지 않는 사용자 정의 필드)의 모든 게시물에 대해 데이터베이스를 쿼리하는 함수 예제입니다.

function get_meta_values( $key = '', $type = 'post', $status = 'publish' ) {

    global $wpdb;

    if( empty( $key ) )
        return;

    $r = $wpdb->get_col( $wpdb->prepare( "
        SELECT pm.meta_value FROM {$wpdb->postmeta} pm
        LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
        WHERE pm.meta_key = %s 
        AND p.post_status = %s 
        AND p.post_type = %s
    ", $key, $status, $type ) );

    return $r;
}

예를 들어, 메타 유형 이 rating 인 게시물, 영화 유형에 대해 해당 정보를 변수에 저장하려는 경우 이러한 호출의 예는 다음과 같습니다.

$movie_ratings = get_meta_values( 'rating', 'movies' );

해당 데이터를 화면에 인쇄하는 것 이상의 작업을 수행하지 않으려는 경우 PHP의 implode 함수는 간단한 배열을 데이터 행으로 빠르게 스플 라이스 할 수 있습니다.

// Print the meta values seperate by a line break
echo implode( '<br />', get_meta_values( 'YOURKEY' ));

예를 들어 반환 된 데이터를 사용하여 반환 된 데이터에 대해 간단한 루프를 수행하고 개수의 배열을 작성하여 이러한 메타 값을 갖는 게시물 수를 계산할 수 있습니다.

$movie_ratings = get_meta_values( 'rating', 'movies' );
if( !empty( $movie_ratings ) ) {
    $num_of_ratings = array();
    foreach( $movie_ratings as $meta_value )
        $num_of_ratings[$meta_value] = ( isset( $num_of_ratings[$meta_value] ) ) ? $num_of_ratings[$meta_value] + 1 : 1;
}

/*
Result:
Array(
    [5] => 10
    [9] => 2
)
// ie. there are 10 movie posts with a rating of 5 and 2 movie posts with a rating of 9.
*/

이 논리는 다양한 종류의 데이터에 적용 할 수 있으며 다양한 방식으로 작동하도록 확장 할 수 있습니다. 그래서 내 예제가 도움이되고 간단하기를 바랍니다.


3
고유 한 메타 값만 가져 오려면 향후 시청자에게도 재미있는 사실입니다 . 위의 함수 DISTINCT바로 뒤에 입력 SELECT하십시오. 유용 할 수 있습니다.
Howdy_McGee

나는 이것이 매우 유용하다고 생각한다
Pablo SG Pacheco

이 작업을 수행하고 정렬 된 값을 반환하는 방법은 무엇입니까? ORDER를 사용하여 사용하는 방법을 알 수 없습니다.
efirvida

14

위의 t31os 코드에 작은 것을 추가하고 싶습니다 . 이 코드를 직접 사용할 때 중복 항목을 제거하기 위해 "SELECT"를 "SELECT DISTINCT"로 변경했습니다.


1
동일한 값의 여러 메타 값을 갖는 것이 유효한 경우를 상상할 수 있으므로 코드에 추가하지 않았습니다. 고유 한 값을 원한다면이 방법을 사용하십시오. 또한 함수의 인수로 추가 할 수도 있습니다 (따라서 적절하게 사용할 수 있습니다).
t31os

10

전역 $ wpdb를 사용하는 것이 좋지 않거나 필요하지 않습니다.

// function to grab all possible meta values of the chosen meta key.
function get_meta_values( $meta_key,  $post_type = 'post' ) {

    $posts = get_posts(
        array(
            'post_type' => $post_type,
            'meta_key' => $meta_key,
            'posts_per_page' => -1,
        )
    );

    $meta_values = array();
    foreach( $posts as $post ) {
        $meta_values[] = get_post_meta( $post->ID, $meta_key, true );
    }

    return $meta_values;

}

$meta_values = get_meta_values( $meta_key, $post_type );

이것은 대부분의 경우 선호하는 방법입니다. 단 하나가 아닌 다섯 개의 쿼리를 생성하지만 표준 WordPress 프로 시저를 사용하여 쿼리를 생성하고 제출할 때 플랫폼 별 캐싱 (예 : WP Engine의 객체 캐싱 또는 임의의 플러그인)이 시작됩니다. 데이터도 요청 기간 동안 WordPress의 내부 캐시에 저장되므로 필요한 경우 데이터베이스에서 다시 검색 할 필요가 없습니다.
앤드류 딘 모어

모든 필터도 데이터에 적용되며, 이는 다국어 사이트와 같이 매우 중요 할 수 있습니다. 마지막으로 표준 WordPress 핵심 기능 만 사용하므로 향후 업데이트로 인해 손상 될 가능성이 훨씬 적습니다.
앤드류 딘 모어

4

가장 빠른 방법은 사용자 정의 SQL 쿼리이며 확실하지 않지만 시도해 볼 수 있습니다

$wpdb->get_results("
  SELECT posts.* , COUNT(*) 'moodcount'
  FROM $wpdb->posts as posts
  JOIN $wpdb->postmeta as postmeta
  ON postmeta.post_id = posts.ID
  AND postmeta.meta_key = 'Mood'
  GROUP BY postmeta.meta_key
");

그렇다면 무엇이든 시작입니다.


1
고맙지 만 맞춤 쿼리를 '모든 비용으로'피해야합니까? 나는 WP 추상화 계층을 사용하는 것을 선호한다 (이것이 무엇인가?). 물론 이것이 가능하지 않다면 ..
mikkelbreum

올바른 방법으로 작성된 사용자 정의 쿼리는 더 좋을 수 있으며 수행중인 작업을 모르는 경우에만 피해야합니다.
Bainternet

1
mwb에 동의합니다. 커스텀 쿼리는 매우 유용하고 실용적이지만, DB에서도 훨씬 무겁다 고 생각합니다. 특히 SRT 함수를 사용합니다.
krembo99

3

메타 키로 모든 메타 값을 가져 오기

wp-> db 워드 프레스 코덱 확인

$values = $wpdb->get_col("SELECT meta_value
    FROM $wpdb->postmeta WHERE meta_key = 'yourmetakey'" );

3
이 접근 방식의 문제는 특이성이 부족하다는 것입니다. 초안, 휴지통 항목, 게시물, 페이지 및 존재하는 다른 게시물 유형을 포함 할 수있는 이러한 쿼리에서 수많은 결과를 얻을 수 있습니다. 당신이 필요로하지 않는 것을 절대로 쿼리해서는 안되며, 여기에서 가장 구체적이 필요합니다.
t31os

다른 게시물 유형 및 상태에서 값을 얻을 수 있다는 것은 사실이지만 필요한 모든 값이 필요한 경우가 있으며 어디에서나 meta_key를 사용하지 않은 경우가 있습니다. 모든 / 대부분의 값이 고유 한 경우 이것이 최선의 해결책 일 수 있습니다.
Luke Gedeon

2

t31os와 Bainternet의 코드를 병합하여 하나의 효율적인 작업으로 카운트와 값을 반환하는 재사용 가능한 준비된 명령문 (워드 프레스 스타일)을 갖도록하는 이유는 없습니다.

그것은 사용자 정의 쿼리이지만 여전히 wordpress 데이터베이스 추상화 계층을 사용하고 있습니다. 예를 들어 테이블 이름이 실제로 무엇인지 또는 변경되는지는 중요하지 않으며 준비된 명령문이므로 SQL 공격 등으로부터 훨씬 안전합니다. .

이 경우 더 이상 게시물 유형을 확인하지 않고 빈 문자열을 제외합니다.

    $r = $wpdb->get_results(  $wpdb->prepare( "
        SELECT pm.meta_value AS name, count(*) AS count  FROM {$wpdb->postmeta} pm
        LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
        WHERE pm.meta_key = '%s'
        AND pm.meta_value != '' 
        AND p.post_type = '%s'
        GROUP BY pm.meta_value
        ORDER BY pm.meta_value          
        ", $key, $type) 
        );
    return $r;

이 특정에서

이것은 다음과 같은 객체 배열을 반환합니다.

array  
 0 => 
 object(stdClass)[359]
  public 'name' => string 'Hamish' (length=6)
  public 'count' => string '3' (length=1)
 1 => 
 object(stdClass)[360]
  public 'name' => string 'Ida' (length=11)
  public 'count' => string '1' (length=1)
 2 => 
 object(stdClass)[361]
  public 'name' => string 'John' (length=12)
  public 'count' => string '1' (length=1)

0

foreach와 함께 다음을 사용하십시오.

 $key = get_post_custom_values( 'key' );

사용자 정의 필드 키의 이름이 다음과 같다고 가정합니다.


post_id가 지정되지 않은 경우 현재 게시물로 기본 설정됩니다.
birgire
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.