किसी कस्टम फ़ील्ड द्वारा वर्डप्रेस कस्टम पोस्ट प्रकार के व्यवस्थापक क्षेत्र को कैसे सॉर्ट करें


52

जब मैं अपने कस्टम पोस्ट प्रकारों में से एक का संपादन करता हूं, तो वे उन सभी प्रविष्टियों को सूचीबद्ध करने में सक्षम होना चाहते हैं जो वे प्रकाशित होने की तारीख के बजाय एक कस्टम फ़ील्ड द्वारा (जो, कस्टम पोस्ट प्रकार के लिए संभवतः प्रासंगिक नहीं है)। मुझे कस्टम पोस्ट प्रकारों के बारे में एक ब्लॉग पोस्ट की टिप्पणियों से लीड मिली और लेखक ने कहा कि यह संभव था और उसने यह भी बनाया ताकि आप कस्टम नामों के लिए कॉलम नामों पर क्लिक कर सकें। उन्होंने उस posts_orderbyफ़ंक्शन का उल्लेख किया जिसे मैंने अपनी टिप्पणियों में नोट किया था, लेकिन अब मैं ब्लॉग पोस्ट पा सकता हूं। कोई सुझाव? मैंने एक समाधान देखा जो इस्तेमाल किया

add_action('wp', 'check_page');

और check_pageफ़ंक्शन add_filterक्वेरी को बदलने के लिए उपयोग किया जाता है, लेकिन मुझे पूरा यकीन है कि यह केवल थीम फ़ाइलों में काम करेगा, व्यवस्थापक क्षेत्र में नहीं।


1
यहाँ एक और उपयोगी उत्तर, .... <br/> द्वारा पोस्ट करने के लिए .... <br/> wordpress.stackexchange.com/questions/66455/…
T.Todua

जवाबों:


66

जैसा कि आप शायद प्रदान किए गए उत्तरों की कमी से कल्पना कर सकते हैं, समाधान बिल्कुल तुच्छ नहीं है। मैंने जो कुछ किया है, वह कुछ हद तक आत्म-निहित उदाहरण है जो movie" Genre " की एक कस्टम पोस्ट प्रकार " " और कस्टम फ़ील्ड कुंजी मानता है ।

अस्वीकरण : यह WP3.0 के साथ काम करता है, लेकिन मुझे यकीन नहीं है कि यह पहले के संस्करणों के साथ काम करेगा।

आपको इसे काम करने के लिए मूल रूप से दो (2) हुक करने की आवश्यकता है और एक और दो (2) को स्पष्ट और उपयोगी बनाने के लिए।

पहला हुक ' restrict_manage_posts' है जो आपको <select>पदों की सूची के ऊपर क्षेत्र में एक HTML को बाहर निकालने की सुविधा देता है जहां " बल्क एक्शन " और " शो डेट्स " फिल्टर हैं। प्रदान किया गया कोड इस स्क्रीन स्निपेट में देखे गए अनुसार " Sort by: " कार्यक्षमता उत्पन्न करेगा।

वर्डप्रेस एडमिन में कस्टम पोस्ट प्रकार के लिए कार्यक्षमता के आधार पर क्रिएट कैसे करें
(स्रोत: mikeschinkel.com )

कोड प्रत्यक्ष एसक्यूएल का उपयोग करता है क्योंकि पोस्ट प्रकार के लिए सभी मेटा_की की सूची प्रदान करने के लिए वर्डप्रेस एपीआई फ़ंक्शन नहीं है ( मेरे लिए भविष्य के टीआरसी टिकट की तरह लगता है ...) वैसे भी, यहां कोड है। ध्यान दें कि यह पोस्ट प्रकार से पकड़ लेता है $_GETऔर यह सुनिश्चित करने के लिए मान्य है कि यह एक मान्य पोस्ट प्रकार के post_type_exists()साथ-साथ movieपोस्ट प्रकार है (वे दो चेक ओवरक्लिक हैं, लेकिन मैंने आपको यह दिखाने के लिए किया कि कैसे आप हार्ड नहीं करना चाहते हैं- पोस्ट प्रकार को कोड करें।) अंतिम रूप से मैं sortbyURL पैरामीटर का उपयोग करता हूं क्योंकि यह वर्डप्रेस में किसी और चीज के साथ संघर्ष नहीं करता है:

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हुक का उपयोग करना है जिसे वर्डप्रेस द्वारा तय किए जाने के बाद कहा जाता है कि क्वेरी क्या चलनी चाहिए लेकिन इससे पहले कि यह क्वेरी चलाता है। यहाँ हम के मूल्यों को निर्धारित करने के लिए मिलता orderbyहै और meta_keyक्वेरी के दशक में query_varसरणी जो कर रहे हैं कोडेक्स में दस्तावेज में orderbyके लिए पैरामीटर query_posts()। हम यह सुनिश्चित करने के लिए परीक्षण करते हैं कि:

  1. हम व्यवस्थापक ( is_admin()) में हैं,
  2. हम उस पृष्ठ पर हैं जो व्यवस्थापक में पोस्ट सूचीबद्ध करता है ( $pagenow=='edit.php'),
  3. पृष्ठ को एक post_typeURL पैरामीटर के बराबर कहा गया है movie, और
  4. पृष्ठ को sortbyURL पैरामीटर के साथ भी बुलाया गया है और इसे ' कोई नहीं ' के मान से पारित नहीं किया गया था

यदि वे सभी परीक्षण पास हो जाते हैं तो हम 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_columnsएक साथ print_r()देखने के लिए और क्या डिफ़ॉल्ट रूप से उपलब्ध है।)

जब कोई URL पैरामीटर हो और जब ऐसा न हो तो मैंने " Sorted By: " जोड़ने का निर्णय लिया :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 पैरामीटर होता है, तो हम कस्टम फ़ील्ड मान को निकालते हैं, जिसे हमारी सूची में प्रदर्शित करके सॉर्ट किया जाता है। यहाँ यह कैसा दिखता है (याद रखें, यह परीक्षण डेटा है इसलिए फिल्म वर्गीकरण पर मूंगफली गैलरी से कोई टिप्पणी नहीं! :):

वर्डप्रेस एडमिन में कस्टम पोस्ट प्रकार के लिए कस्टम कॉलम जोड़े गए
(स्रोत: 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;
        }
    }
}

ध्यान दें कि यह केवल a के लिए पहला " Genre " चुनता है movie, अर्थात किसी दिए गए कुंजी के लिए कई मानों के मामले में पहला meta_value। लेकिन फिर मुझे यकीन नहीं है कि यह कैसे काम करेगा अन्यथा!

और उन अपरिचित लोगों के लिए जहां इस कोड को रखने के लिए आप इसे एक प्लगइन में डाल सकते हैं या functions.phpअपने वर्तमान विषय में फ़ाइल में नौसिखिया के लिए अधिक संभावना है ।

यह कैसे मदद करता है।


2
+1, केवल प्रयास के लिए। लेकिन अगर सर्किल को हाथ से खींचा गया तो यह और भी बेहतर होगा :-)
Jan Fabry

किसी भी विचार को कैसे निकालें SHOW ALL DATES फ़िल्टर पूरी तरह से केवल मेरे कस्टम फ़िल्टर किसी दिए गए पोस्ट प्रकार के लिए दिखा रहे हैं?
RailsTweeter

@RailsTweeter मैंने यहां दिखाई गई तकनीक का उपयोग करें जहां दो हुक जो HTML पीढ़ी को ब्रैकेट करते हैं 'months_dropdown_results'और 'restrict_manage_posts'। पीएस अपवोट्स को हमेशा सराहा जाता है। :)
माइकस्किंकल

@MikeSchinkel, अब WP API है, क्या यह आपके कोड को कुछ हद तक अपडेट करेगा?
samjco

@samjco यकीन नहीं होता। दुर्भाग्य से मेरे पास इस समय इसे संशोधित करने का समय नहीं है।
माइकस्किंकेल

8

वर्डप्रेस 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 TYPE और 'your_custom_field' बदलें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.