วิธีจัดเรียงพื้นที่การดูแลของประเภทโพสต์ที่กำหนดเอง WordPress ตามฟิลด์ที่กำหนดเอง


52

เมื่อแก้ไขหนึ่งในประเภทโพสต์ที่กำหนดเองของฉันฉันต้องการที่จะสามารถแสดงรายการทั้งหมดโดยฟิลด์ที่กำหนดเองแทนวันที่พวกเขาได้รับการเผยแพร่ (ซึ่งสำหรับประเภทโพสต์ที่กำหนดเองอาจไม่เกี่ยวข้อง) ฉันได้รับความเห็นชอบจากความคิดเห็นของบล็อกโพสต์เกี่ยวกับประเภทโพสต์ที่กำหนดเองและผู้เขียนบอกว่ามันเป็นไปได้และเขาก็สร้างมันขึ้นมาดังนั้นคุณสามารถคลิกที่ชื่อคอลัมน์เพื่อจัดเรียงแบบกำหนดเองได้ เขาพูดถึงposts_orderbyฟังก์ชั่นที่ฉันบันทึกไว้ในความคิดเห็นของตัวเอง แต่ตอนนี้ฉันสามารถหาโพสต์บล็อกได้อีก ข้อเสนอแนะใด ๆ ฉันเห็นทางออกหนึ่งที่ใช้

add_action('wp', 'check_page');

และcheck_pageฟังก์ชั่นที่ใช้add_filterในการเปลี่ยนแบบสอบถาม แต่ฉันค่อนข้างแน่ใจว่ามันจะทำงานเฉพาะในไฟล์ชุดรูปแบบไม่ได้อยู่ในพื้นที่ผู้ดูแลระบบ


1
นี่คือคำตอบที่เป็นประโยชน์อีกข้อหนึ่งเพื่อเรียงลำดับโพสต์โดย .... <br/> wordpress.stackexchange.com/questions/66455/…
T.Todua

คำตอบ:


66

ในขณะที่คุณสามารถจินตนาการได้โดยขาดคำตอบที่ให้ไว้วิธีการแก้ปัญหาไม่ได้เป็นเรื่องเล็กน้อย สิ่งที่ฉันทำคือสร้างตัวอย่างที่มีอยู่ในตัวเองซึ่งถือว่าประเภทโพสต์ที่กำหนดเองของ " movie" และคีย์ฟิลด์ที่กำหนดเองของ " ประเภท "

ข้อจำกัดความรับผิดชอบ : สิ่งนี้ใช้ได้กับ WP3.0 แต่ฉันไม่แน่ใจว่ามันจะทำงานกับเวอร์ชันก่อนหน้านี้ได้หรือไม่

โดยทั่วไปคุณต้องขอสอง (2) hooks เพื่อให้มันทำงานและอีกสอง (2) เพื่อให้ชัดเจนและมีประโยชน์

เบ็ดแรกคือ ' restrict_manage_posts' ซึ่งช่วยให้คุณปล่อย HTML <select>ในพื้นที่ด้านบนรายการโพสต์ที่มีตัวกรอง "การกระทำเป็นกลุ่ม " และ " แสดงวันที่ " รหัสที่ให้มาจะสร้างฟังก์ชัน" เรียงตาม: " ตามที่เห็นในตัวอย่างหน้าจอนี้:

วิธีการสร้างเรียงตามฟังก์ชั่นสำหรับประเภทโพสต์ที่กำหนดเองใน WordPress Admin
(ที่มา: mikeschinkel.com )

รหัสนี้ใช้ SQL โดยตรงเพราะไม่มีฟังก์ชั่น WordPress API เพื่อให้รายการของ meta_keys ทั้งหมดสำหรับประเภทโพสต์ (ฟังเหมือนตั๋วtracในอนาคตสำหรับฉัน ... ) อย่างไรก็ตามนี่คือรหัส โปรดทราบว่าประเภทคว้าโพสต์จาก$_GETและตรวจสอบเพื่อให้แน่ใจว่ามันเป็นทั้งประเภทโพสต์ที่ถูกต้องpost_type_exists()เช่นเดียวกับmovieประเภทโพสต์ (ตรวจสอบทั้งสองนั้นเป็น overkill แต่ฉันทำเพื่อแสดงให้คุณเห็นว่าถ้าคุณไม่ต้องการ โค้ดประเภทโพสต์) สุดท้ายฉันใช้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);
        }
    }
}

ขั้นตอนที่สองที่จำเป็นคือการใช้parse_queryเบ็ดที่เรียกว่าหลังจาก WordPress ตัดสินใจหนึ่งสิ่งที่แบบสอบถามควรจะทำงาน แต่ก่อนที่จะเรียกใช้แบบสอบถาม ที่นี่เราได้รับการตั้งค่าorderbyและmeta_keyในแบบสอบถามของquery_varอาเรย์ซึ่งได้รับการบันทึกไว้ใน Codexในพารามิเตอร์orderby query_posts()เราทดสอบเพื่อให้แน่ใจว่า:

  1. เราอยู่ในผู้ดูแลระบบ ( is_admin())
  2. เราอยู่ในหน้าที่แสดงรายการโพสต์ในผู้ดูแลระบบ ( $pagenow=='edit.php')
  3. หน้านี้ถูกเรียกใช้โดยมีpost_typeพารามิเตอร์ URL เท่ากับmovieและ
  4. หน้านี้ถูกเรียกใช้พร้อมกับsortbyพารามิเตอร์ URL และไม่ได้ส่งค่าเป็น ' ไม่มี '

หากการทดสอบเหล่านั้นผ่านเราก็ตั้งค่า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'];
    }
}

และนั่นคือทั้งหมดที่คุณต้องทำ ไม่จำเป็นต้องใช้ hooks " posts_order" หรือ " wp"! แน่นอนคุณต้องทำมากขึ้น คุณต้องเพิ่มบางคอลัมน์ในหน้าของคุณที่แสดงรายการการโพสต์เพื่อให้คุณสามารถดูค่าที่เรียงตามมิฉะนั้นผู้ใช้จะสับสนมาก ดังนั้นเพิ่มmanage_{$post_type}_posts_columnsตะขอในกรณีmanage_movie_posts_columnsนี้ เบ็ดนี้ได้รับการผ่านอาร์เรย์เริ่มต้นของคอลัมน์และเพื่อความง่ายฉันเพิ่งแทนที่มันด้วยสองคอลัมน์มาตรฐาน ช่องทำเครื่องหมาย ( cb) และชื่อโพสต์ ( title) (คุณสามารถตรวจสอบposts_columnsด้วย a print_r()เพื่อดูว่ามีอะไรอื่นให้เลือกใช้ได้ตามค่าเริ่มต้น)

ฉันตัดสินใจเพิ่ม " เรียงลำดับตาม: " เมื่อมีsortbyพารามิเตอร์ URL และเมื่อไม่None:

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 เราจะแยกค่าฟิลด์ที่กำหนดเองที่จะเรียงลำดับตามการแสดงในรายการของเรา นี่คือสิ่งที่ดูเหมือน (โปรดจำไว้ว่านี่คือข้อมูลทดสอบดังนั้นจึงไม่มีความคิดเห็นจากแกลเลอรีถั่วลิสงในการจัดประเภทภาพยนตร์! :):

เพิ่มคอลัมน์ที่กำหนดเองสำหรับประเภทโพสต์ที่กำหนดเองใน 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;
        }
    }
}

โปรดทราบว่านี่จะเลือก " Genre " แรกสำหรับ a movieเท่านั้นนั่นคือ meta_value แรกในกรณีที่มีค่าหลายค่าสำหรับคีย์ที่กำหนด แต่อีกครั้งฉันไม่แน่ใจว่ามันจะทำงานอย่างไร!

และสำหรับผู้ที่ไม่คุ้นเคยกับการวางรหัสนี้คุณสามารถวางไว้ในปลั๊กอินหรือเป็นไปได้มากขึ้นสำหรับมือใหม่ในfunctions.phpไฟล์ในธีมปัจจุบันของคุณ

มันช่วยได้อย่างไร


2
+1 เพียงเพื่อความพยายาม แต่มันจะดียิ่งขึ้นถ้าวงกลมที่ถูกวาดด้วยมือ :-)
ม.ค. Fabry

แนวคิดใดที่จะลบตัวกรอง SHOW ALL DATES ทั้งหมดเพื่อให้เฉพาะตัวกรองที่กำหนดเองของฉันแสดงสำหรับประเภทโพสต์ที่ระบุ
RailsTweeter

@RailsTweeter ใช้เทคนิคที่ผมแสดงให้เห็นที่นี่ที่ทั้งสองตะขอที่ยึดรุ่น HTML มีและ'months_dropdown_results' 'restrict_manage_posts'PS Upvotes ได้รับการชื่นชมเสมอ :)
MikeSchinkel

@MikeSchinkel ตอนนี้มี WP API นี่จะอัปเดตโค้ดของคุณบ้างไหม?
samjco

@samjco ไม่แน่ใจ ฉันโชคไม่ดีที่ไม่มีเวลาแก้ไขในตอนนี้
MikeSchinkel

8

ในฐานะที่เป็นคอลัมน์ WordPress 3.1 (ฉันใช้เบต้า) ตอนนี้สามารถเรียงลำดับผ่านชื่อของพวกเขา

โพสต์ต่อไปนี้มีรายละเอียดวิธีการใช้งาน

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


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

เพียงแทนที่ประเภท POST ของคุณและ'your_custom_field'

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.