it-swarm-ko.tech

사용자 정의 필드로 WordPress 사용자 정의 게시 유형의 관리 영역을 정렬하는 방법

내 사용자 정의 게시 유형 중 하나를 편집 할 때 게시 된 날짜 대신 사용자 정의 필드로 모든 항목을 나열 할 수 있기를 원합니다 (사용자 정의 게시 유형의 경우 관련이 없음). 사용자 정의 게시물 유형에 대한 블로그 게시물의 의견에서 리드를 얻었으며 작성자는 가능하다고 말하면서 사용자 정의 정렬을 위해 열 이름을 클릭 할 수있게했습니다. 그는 자신의 의견에서 언급 한 posts_orderby function을 언급했지만 이제는 블로그 게시물을 더 이상 찾을 수 없습니다. 어떤 제안? 나는 한 가지 해결책을 보았다.

add_action('wp', 'check_page');

check_page 함수는 add_filter 를 사용하여 쿼리를 변경했지만 관리 영역이 아닌 테마 파일에서만 작동 할 것이라고 확신합니다.

52
tooshel

제공된 답변이 부족하다고 상상할 수 있듯이 솔루션은 사소한 것이 아닙니다. 내가 한 것은 "movie"의 사용자 정의 게시물 유형과 "Genre"의 사용자 정의 필드 키를 가정하는 다소 독립적 인 예제를 만드는 것입니다.

면책 조항 : 이것은 WP3.0에서 작동하지만 이전 버전에서 작동하는지 확신 할 수 없습니다.

기본적으로 작동하려면 두 개의 후크를 연결하고 명확하고 유용하게 만들려면 두 개의 후크를 연결해야합니다.

첫 번째 후크는 'restrict_manage_posts'이며, "대량 작업"및 "표시가있는 게시물 목록 위의 영역에서 HTML <select>을 표시 할 수 있습니다. 날짜 "필터. 제공된 코드는이 화면 스 니펫에 표시된대로 "Sort by :"기능을 생성합니다.

How to Create Sort By functionality for a Custom Post Type in the WordPress Admin
(출처 : mikeschinkel.com )

이 코드는 WordPress API 함수가 없기 때문에 직접 SQL을 사용하여 게시물 유형에 대한 모든 meta_key 목록을 제공합니다 (미래와 같은 소리 trac ticket to me ...) 어쨌든, 여기 코드가 있습니다. $_GET에서 게시물 유형을 가져 와서 유효한 게시물 유형 post_type_exists()movie 게시물 유형인지 확인합니다 (두 번의 확인이 너무 과도하지만 그 방법을 보여주었습니다) 게시물 유형을 하드 코딩하고 싶지 않습니다.) 마지막으로 sortby URL 매개 변수는 WordPress의 다른 항목과 충돌하지 않으므로 사용합니다.

add_action('restrict_manage_posts','restrict_manage_movie_sort_by_genre');
function restrict_manage_movie_sort_by_genre() {
    if (isset($_GET['post_type'])) {
        $post_type = $_GET['post_type'];
        if (post_type_exists($post_type) && $post_type=='movie') {
            global $wpdb;
            $sql=<<<SQL
SELECT pm.meta_key FROM {$wpdb->postmeta} pm
INNER JOIN {$wpdb->posts} p ON p.ID=pm.post_id
WHERE p.post_type='movie' AND pm.meta_key='Genre'
GROUP BY pm.meta_key
ORDER BY pm.meta_key
SQL;
            $results = $wpdb->get_results($sql);
            $html = array();
            $html[] = "<select id=\"sortby\" name=\"sortby\">";
            $html[] = "<option value=\"None\">No Sort</option>";
            $this_sort = $_GET['sortby'];
            foreach($results as $meta_key) {
                $default = ($this_sort==$meta_key->meta_key ? ' selected="selected"' : '');
                $value = esc_attr($meta_key->meta_key);
                $html[] = "<option value=\"{$meta_key->meta_key}\"$default>{$value}</option>";
            }
            $html[] = "</select>";
            echo "Sort by: " . implode("\n",$html);
        }
    }
}

두 번째 필수 단계는 WordPress가 쿼리를 실행하기 전에 수행해야 할 쿼리를 결정한 후에 호출되는 parse_query 후크를 사용하는 것입니다. 여기서 우리는 query_posts()에 대한 orderby 매개 변수에서 Codex에 문서화 됨 인 쿼리의 meta_key 배열에서 orderbyquery_var 값을 설정합니다. 우리는 다음을 확인하기 위해 테스트합니다.

  1. 우리는 관리자 (is_admin())에 있습니다.
  2. 관리자 ($pagenow=='edit.php')의 게시물을 나열하는 페이지에 있습니다.
  3. 페이지가 movie과 (과) 동일한 post_type URL 매개 변수로 호출되었습니다.
  4. 또한 페이지가 sortby URL 매개 변수와 함께 호출되었으며 'None'값이 전달되지 않았습니다.

모든 테스트를 통과하면 query_vars (- 여기 에 설명 된대로)를 meta_value로 설정하고 'Genre'에 대한 sortby 값을 설정합니다.

add_filter( 'parse_query', 'sort_movie_by_meta_value' );
function sort_movie_by_meta_value($query) {
    global $pagenow;
    if (is_admin() && $pagenow=='edit.php' &&
        isset($_GET['post_type']) && $_GET['post_type']=='movie' && 
        isset($_GET['sortby'])  && $_GET['sortby'] !='None')  {
        $query->query_vars['orderby'] = 'meta_value';
        $query->query_vars['meta_key'] = $_GET['sortby'];
    }
}

그리고 이것이 당신이해야 할 전부입니다. "posts_order"또는 "wp"후크가 필요하지 않습니다! 물론 실제로 더 많은 일을해야합니다. 페이지에 게시물을 나열하는 일부 열을 추가해야 실제로 정렬 기준으로 값을 정렬 할 수 있습니다. 그렇지 않으면 사용자가 혼동 될 수 있습니다. manage_{$post_type}_posts_columns 후크 (이 경우 manage_movie_posts_columns)를 추가하십시오. 이 후크는 기본 열 배열을 전달 받았으므로 간단하게 두 개의 표준 열로 대체했습니다. 확인란 (cb) 및 게시물 이름 (title). (print_r()posts_columns을 (를) 검사하여 기본적으로 사용 가능한 다른 항목을 확인할 수 있습니다.)

sortby URL 매개 변수가 있고 None이 아닌 경우 "Sorted By :"를 추가하기로 결정했습니다.

add_action('manage_movie_posts_columns', 'manage_movie_posts_columns');
function manage_movie_posts_columns($posts_columns) {
    $posts_columns = array(
        'cb' => $posts_columns['cb'],
        'title' => 'Movie Name',
        );
    if (isset($_GET['sortby']) && $_GET['sortby'] !='None') 
        $posts_columns['meta_value'] = 'Sorted By';

    return $posts_columns;
}

마지막으로 manage_pages_custom_column 후크를 사용하여 적절한 게시물 유형의 게시물이 있고 is_admin()$pagenow=='edit.php'에 대한 중복 테스트가있을 때 실제로 값을 표시합니다. sortby URL 매개 변수가 있으면 목록에 표시되는 정렬 된 사용자 정의 필드 값을 추출합니다. 다음은 그 모습입니다 (이는 테스트 데이터이므로 영화 분류에 대한 땅콩 갤러리의 의견은 없습니다! :) :

Custom Columns added for a Custom Post Type in the WordPress Admin
(출처 : mikeschinkel.com )

그리고 여기 코드가 있습니다 :

add_action('manage_pages_custom_column', 'manage_movie_pages_custom_column',10,2);
function manage_movie_pages_custom_column($column_name,$post_id) {
    global $pagenow;
    $post = get_post($post_id);
    if ($post->post_type=='movie' && is_admin() && $pagenow=='edit.php')  {
        switch ($column_name) {
            case 'meta_value':
                if (isset($_GET['sortby']) && $_GET['sortby'] !='None') {
                    echo get_post_meta($post_id,$_GET['sortby'],true);
                }
                break;
        }
    }
}

이것은 movie에 대한 첫 번째 "Genre", 즉 주어진 키에 대한 여러 값의 경우 첫 번째 meta_value 만 선택합니다. 그러나 다시 어떻게 작동하는지 잘 모르겠습니다!

이 코드를 어디에 두어야할지 잘 모르는 분들을 위해 현재 테마의 functions.php 파일에있는 초보자 용 플러그인이나 플러그인에 넣을 수 있습니다.

이것이 도움이되는 방법.

66
MikeSchinkel

현재 WordPress 3.1 (베타 버전 사용 중) 열은 제목을 통해 정렬 할 수 있습니다.

다음 게시물은 구현 방법을 자세히 설명합니다.

http://scribu.net/wordpress/custom-sortable-columns.html

8
Leo Plaw