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


52

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

add_action('wp', 'check_page');

그리고이 check_page함수 add_filter는 쿼리를 변경하는 데 사용 되었지만 관리 영역이 아닌 테마 파일에서만 작동한다고 확신합니다.


답변:


66

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

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

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

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

WordPress 관리자에서 사용자 정의 게시물 유형에 대한 정렬 기준 기능을 작성하는 방법
(출처 : mikeschinkel.com )

포스트 코드에 대한 모든 meta_keys 목록을 제공하는 WordPress API 함수가 없기 때문에 코드는 직접 SQL을 사용합니다 (나중에 trac 티켓 처럼 들립니다 ...) 어쨌든 여기 코드가 있습니다. 게시물 유형을 가져 $_GET와서 유효한 게시물 유형 post_type_exists()뿐만 아니라 게시물 유형인지 확인합니다 movie(두 가지 검사가 과도하지만 과도하지 않으려면 어떻게 해야하는지 보여줍니다. 마지막으로 sortbyURL 매개 변수는 WordPress의 다른 항목과 충돌하지 않으므로 URL 매개 변수를 사용합니다 .

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);
        }
    }
}

두 번째로 필요한 단계는 parse_queryWordPress가 쿼리를 실행할 쿼리를 결정한 후 쿼리를 실행하기 전에 호출 되는 후크 를 사용하는 것입니다. 여기에서 우리는의 값을 설정할 수 orderbymeta_key쿼리의에서 query_var하는 배열 분과에 설명orderby대한 매개 변수를 query_posts(). 우리는 다음을 확인하기 위해 테스트합니다.

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

모든 테스트를 통과하면 우리는 다음 설정 query_vars(문서화 된 여기 )에 meta_value우리의 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). posts_columnsa print_r()로 검사 하여 기본적으로 사용 가능한 다른 항목을 확인할 수 있습니다.

URL 매개 변수가 있고 그렇지 않은 경우 에 대해 " 정렬 기준 : " 을 추가하기로 결정했습니다 .sortbyNone

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'. 있을 때 sortbyURL 매개 변수를 우리는 우리의 목록에 표시 그것으로 분류되고있는 사용자 정의 필드 값을 추출합니다. 다음은 그 모습입니다 (이는 테스트 데이터이므로 영화 분류에 대한 땅콩 갤러리의 의견은 없습니다! :) :

WordPress 관리자에서 사용자 정의 게시물 유형에 추가 된 사용자 정의 열
(출처 : 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, 즉 주어진 키에 대해 여러 값이있는 경우 첫 번째 meta_value 만 선택합니다 . 그러나 다시 어떻게 작동하는지 잘 모르겠습니다!

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

이것이 도움이되는 방법.


2
노력으로 +1. 그러나 원이 손으로 그린다면 훨씬 더 나을 것입니다 :-)
Jan Fabry

특정 게시물 유형에 대해 내 사용자 정의 필터 만 표시되도록 SHOW ALL DATES 필터를 완전히 제거하는 방법에 대한 아이디어가 있습니까?
RailsTweeter 17:02에

기술을 사용 @RailsTweeter 나는 HTML 생성을 브래킷 두 개의 고리가 어디 여기 보여 'months_dropdown_results''restrict_manage_posts'. PS 공감대는 항상 높이 평가됩니다. :)
MikeSchinkel

@MikeSchinkel, 이제 WP API가 있으므로 코드가 다소 업데이트됩니까?
samjco

@samjco 확실하지 않습니다. 불행히도 현재 수정할 시간이 없습니다.
MikeSchinkel


-1

간단한 해결책은 다음과 같습니다.

/* --------Sortable Events on Dashboard - show start date, time, venue--------- */

/*-------------------------------------------------------------------------------
    Custom Columns
-------------------------------------------------------------------------------*/

function my_*YOUR POST TYPE*_columns($columns)
{
    $columns = array(
        'cb'        => '<input type="checkbox" />',
        'title'     => 'Title',
        'your_custom_field'     => 'Custom Field Name',          
        'date'      =>  'Date',
    );
    return $columns;
}

function my_custom_columns($column)
{
    global $post;
    if($column == 'your_custom_field')
    {
        if(get_post_meta($post->ID, 'your_custom_field', true);)
        {
            echo get_post_meta($post->ID, 'your_custom_field', true);
        }
    }

}

add_action("manage_posts_custom_column", "my_custom_columns");
add_filter("manage_edit-*YOUR POST TYPE*_columns", "my_events_columns");

/*-------------------------------------------------------------------------------
    Sortable Columns
-------------------------------------------------------------------------------*/

function my_column_register_sortable( $columns )
{
    $columns['your_custom_field'] = 'your_custom_field';
    return $columns;
}

add_filter("manage_edit-*YOUR POST TYPE*_sortable_columns", "my_column_register_sortable" );

그냥 교체 귀하의 게시물 TYPE'your_custom_field을'

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