IT

게시된 사용자 지정 게시글 수에 따라 워드프레스 작성자 순서 가져오기

itgroup 2023. 10. 20. 13:35
반응형

게시된 사용자 지정 게시글 수에 따라 워드프레스 작성자 순서 가져오기

내 WordPress v5.8.1에서 사용자 지정 게시물에 게시하는 작성자 목록이 있습니다.song그리고.poem. 아래 코드로 둘 다 또는 하나의 커스텀 포스트에 게시한 저자 목록을 받고 있습니다.

 $authors = get_users(array(
        'who' => 'authors',
        'has_published_posts' => array('song','poem'),
        'orderby' => 'post_count',
        'order' => 'DESC',
        'number' => '15'
 ));

아래 코드는 모든 저자의 게시물 수를 나열한 것입니다.

foreach ($authors as $user) {
   $name = $user->first_name . ' ' . $user->last_name;
   $songs = count_user_posts($user->ID, $post_type = "song");
   $poems = count_user_posts($user->ID, $post_type = "poem");
   echo $name.' has '. $songs .' songs, and '. $poems .' poems;
}

와 함께'orderby' => 'post_count'논쟁에서, 나는 결합된 사용자 지정 게시물 수가 가장 높은 작성자 목록이 먼저 표시될 것으로 예상했지만, 그것은 순서 없이 무작위로 표시되고 있고, 그것은 또한 다음과 같이 표시되지 않습니다.post_counts도 아니다ID.

총 게시물을 가장 많이 합산한 작가를 어떻게 주문할 수 있습니까?

아래 코드를 사용해 보십시오.

$authors = get_users(array(
    'who' => 'authors',
    'has_published_posts' => array('song','poem'),
    'orderby' => 'post_count',
    'order' => 'DESC',
    'number' => '15'
));

하나 만들기array그리고 총 시 + 노래를 세어봅니다.

$author_posts = array();

foreach ($authors as $user) {
    $name = $user->first_name . ' ' . $user->last_name;
    $songs = count_user_posts($user->ID, $post_type = "song");
    $poems = count_user_posts($user->ID, $post_type = "poem");
    $author_posts[] = array(
        'total' => $songs+$poems,
        'label' => $name.' has '. $songs .' songs, and '. $poems .' poems'
    );
}

이제 'usort를 사용하여 배열을 합계로 정렬합니다.

usort($author_posts, function($a, $b) {
    if($a['total']==$b['total']) return 0;
    return $a['total'] < $b['total']?1:-1;
}); 

출력물을 인쇄합니다.

foreach ( $author_posts as $key => $author_post ) {
    echo $author_post['label']."</br>";
}

완전한 코드.

$authors = get_users(array(
    'who' => 'authors',
    'has_published_posts' => array('song','poem'),
    'orderby' => 'post_count',
    'order' => 'DESC',
    'number' => '15'
));

$author_posts = array();

foreach ($authors as $user) {
    $name = $user->first_name . ' ' . $user->last_name;
    $songs = count_user_posts($user->ID, $post_type = "song");
    $poems = count_user_posts($user->ID, $post_type = "poem");
    $author_posts[] = array(
        'total' => $songs+$poems,
        'label' => $name.' has '. $songs .' songs, and '. $poems .' poems'
    );
}

usort($author_posts, function($a, $b) {
    if($a['total']==$b['total']) return 0;
    return $a['total'] < $b['total']?1:-1;
}); 

foreach ( $author_posts as $key => $author_post ) {
    echo $author_post['label']."</br>";
}

테스트를 거쳐 작동합니다.

먼저 함수 get_users()의 인수에 의한 순서는 post_count와 함께 작동하지만 모든 포스트 유형(여기서는 , 노래포스트 또는 페이지와 같은 다른 유형을 세는 것입니다.

특정 커스텀 포스트 유형별로 결과를 주문하고 싶다면 wpdb 클래스를 사용하여 자신의 요청을 설계하는 것을 추천합니다.이렇게 하면 한 번의 요청으로 원하는 정확한 결과를 얻을 수 있으며, 이후에 결과를 정렬할 마다 for를 사용할 필요가 없습니다.

이런 식으로 해봤는데 효과가 있었습니다.

$authors = $wpdb->get_results(
    "SELECT
        $wpdb->users.ID AS author_id,
        $wpdb->users.display_name AS author_name,
        COUNT($wpdb->posts.ID) AS published_songs_and_poems,
        COUNT(CASE WHEN $wpdb->posts.post_type = 'song' THEN $wpdb->posts.ID ELSE NULL END) as published_songs,
        COUNT(CASE WHEN $wpdb->posts.post_type = 'poem' THEN $wpdb->posts.ID ELSE NULL END) as published_poems
    FROM $wpdb->users
    JOIN $wpdb->posts
        ON $wpdb->posts.post_author = $wpdb->users.ID
        AND $wpdb->posts.post_type IN('song', 'poem') AND $wpdb->posts.post_status = 'publish'
    GROUP BY author_id
    ORDER BY published_songs_and_poems DESC"
);

이 요청은 출판된 노래와 시의 총량에 따라 저자별, 순서별로 그룹화된 결과를 가진 개체를 반환합니다.

이 개체는 이미 사용한 것처럼 사용할 수 있습니다.이와 같은 것:

array_walk($authors, function($author) {
    echo $author->author_name." has published ".$author->published_songs." song(s) and ".$author->published_poems." poem(s).<br/>";
});

첫 번째 버전은 결과 순서를 총 post_count로 반환하는 방법에 초점을 두었기 때문에 이 답변을 편집했습니다.이것은 @the King에 의해 언급되었을 때 명확히 밝혀졌습니다.

당신의 안에 오류가 있습니다.foreach블록, 문제의 원인일 수도 있습니다.대신 사용:

foreach ($authors as $user) {
   $name = $user->first_name . ' ' . $user->last_name;
   $songs = count_user_posts($user->ID, "songs");
   echo $name.' has '. $songs .' songs ';
}

간단히 말해서, 를 교체합니다.$post_type = "songs"간단히"songs". 허용된 매개변수에 대한 자세한 내용은 설명서를 참조하십시오.

편집: 질문을 잘못 이해했습니다.당신의 질문을 보니 모든 것이 그대로여서 문제의 원인을 다른 곳에서 찾아보겠습니다.쿼리를 변경할 수 있는 플러그인이나 필터가 있습니까?쿼리를 데이터베이스에 직접 복제할 수 있으며 거기에서 작동합니까?(테이블 또는 인덱스 손상을 제외하려면)

이것을 시도해 보십시오.

<?php wp_list_authors( $args ); ?> 



<?php $args = array(
'post_type'     => 'custom_post_type',
'orderby'       => 'post_count', 
'order'         => 'DESC', 
'number'        => null,
'optioncount'   => false, 
'exclude_admin' => true, 
'show_fullname' => false,
'hide_empty'    => true,
'echo'          => true,
'style'         => 'list',
'html'          => true ); ?> 

는 쿼리 모니터 플러그인을 사용해서 이것을 공격할 것입니다.

다른 사람들이 제안한 것처럼, 이것이 여러분이 기대하는 대로 작동하지 않을 수 있는 몇 가지 이유가 있습니다.하나는 다른 플러그인에 의해 쿼리가 변경되고 있다는 것입니다.다른 하나는 쿼리는 괜찮지만 post_count가 사용자가 예상하는 것이 아니라는 것입니다.문제의 진상을 파악하려면 쿼리에 무슨 일이 일어나고 있는지 정확하게 확인해야 합니다.

쿼리 모니터 플러그인을 설치하고 활성화합니다.쿼리를 실행하는 페이지를 로드한 다음 쿼리 모니터 출력을 엽니다.쿼리 아래를 보고 스크롤을 내려 검색하면 검색할 수 있습니다.워드프레스가 실행중인 쿼리를 보여줍니다.그것을 확인하고 그것이 당신이 기대하는 것인지 확인하세요.

쿼리가 변경된 경우 범인을 찾을 때까지 플러그인 비활성화를 시작합니다.

쿼리가 올바른 경우 복사한 후 데이터베이스(phpmyadmin 또는 사용하는 모든 것)로 이동하여 직접 실행합니다.데이터베이스에서 직접 결과를 볼 수 있으며 레코드의 순서가 예상과 다른 이유를 알 수 있습니다.

언급URL : https://stackoverflow.com/questions/64699249/get-wordpress-authors-in-order-by-the-number-of-custom-posts-published

반응형