जैसा कि आप शायद प्रदान किए गए उत्तरों की कमी से कल्पना कर सकते हैं, समाधान बिल्कुल तुच्छ नहीं है। मैंने जो कुछ किया है, वह कुछ हद तक आत्म-निहित उदाहरण है जो movie
" Genre " की एक कस्टम पोस्ट प्रकार " " और कस्टम फ़ील्ड कुंजी मानता है ।
अस्वीकरण : यह WP3.0 के साथ काम करता है, लेकिन मुझे यकीन नहीं है कि यह पहले के संस्करणों के साथ काम करेगा।
आपको इसे काम करने के लिए मूल रूप से दो (2) हुक करने की आवश्यकता है और एक और दो (2) को स्पष्ट और उपयोगी बनाने के लिए।
पहला हुक ' restrict_manage_posts
' है जो आपको <select>
पदों की सूची के ऊपर क्षेत्र में एक HTML को बाहर निकालने की सुविधा देता है जहां " बल्क एक्शन " और " शो डेट्स " फिल्टर हैं। प्रदान किया गया कोड इस स्क्रीन स्निपेट में देखे गए अनुसार " Sort by: " कार्यक्षमता उत्पन्न करेगा।
(स्रोत: mikeschinkel.com )
कोड प्रत्यक्ष एसक्यूएल का उपयोग करता है क्योंकि पोस्ट प्रकार के लिए सभी मेटा_की की सूची प्रदान करने के लिए वर्डप्रेस एपीआई फ़ंक्शन नहीं है ( मेरे लिए भविष्य के टीआरसी टिकट की तरह लगता है ...) वैसे भी, यहां कोड है। ध्यान दें कि यह पोस्ट प्रकार से पकड़ लेता है $_GET
और यह सुनिश्चित करने के लिए मान्य है कि यह एक मान्य पोस्ट प्रकार के post_type_exists()
साथ-साथ movie
पोस्ट प्रकार है (वे दो चेक ओवरक्लिक हैं, लेकिन मैंने आपको यह दिखाने के लिए किया कि कैसे आप हार्ड नहीं करना चाहते हैं- पोस्ट प्रकार को कोड करें।) अंतिम रूप से मैं sortby
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_query
हुक का उपयोग करना है जिसे वर्डप्रेस द्वारा तय किए जाने के बाद कहा जाता है कि क्वेरी क्या चलनी चाहिए लेकिन इससे पहले कि यह क्वेरी चलाता है। यहाँ हम के मूल्यों को निर्धारित करने के लिए मिलता orderby
है और meta_key
क्वेरी के दशक में query_var
सरणी जो कर रहे हैं कोडेक्स में दस्तावेज में orderby
के लिए पैरामीटर query_posts()
। हम यह सुनिश्चित करने के लिए परीक्षण करते हैं कि:
- हम व्यवस्थापक (
is_admin()
) में हैं,
- हम उस पृष्ठ पर हैं जो व्यवस्थापक में पोस्ट सूचीबद्ध करता है (
$pagenow=='edit.php'
),
- पृष्ठ को एक
post_type
URL पैरामीटर के बराबर कहा गया है movie
, और
- पृष्ठ को
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'];
}
}
और आपको बस इतना करना है; कोई " posts_order
" या " wp
" हुक की आवश्यकता नहीं है! बेशक आपको वास्तव में और अधिक करने की आवश्यकता है; आपको अपने पृष्ठ पर कुछ कॉलम जोड़ने होंगे जो पदों को सूचीबद्ध करते हैं ताकि आप वास्तव में उन मूल्यों को देख सकें जो इसे छांट रहे हैं अन्यथा उपयोगकर्ता बहुत भ्रमित हो जाएंगे। तो manage_{$post_type}_posts_columns
इस मामले में, एक हुक जोड़ें manage_movie_posts_columns
। यह हुक स्तंभों के डिफ़ॉल्ट सरणी को पास करता है और सादगी के लिए मैंने इसे केवल दो मानक स्तंभों के साथ बदल दिया; एक चेकबॉक्स ( cb
) और एक पोस्ट नाम ( title
)। (आप निरीक्षण कर सकते हैं posts_columns
एक साथ print_r()
देखने के लिए और क्या डिफ़ॉल्ट रूप से उपलब्ध है।)
जब कोई URL पैरामीटर हो और जब ऐसा न हो तो मैंने " Sorted By: " जोड़ने का निर्णय लिया :sortby
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 पैरामीटर होता है, तो हम कस्टम फ़ील्ड मान को निकालते हैं, जिसे हमारी सूची में प्रदर्शित करके सॉर्ट किया जाता है। यहाँ यह कैसा दिखता है (याद रखें, यह परीक्षण डेटा है इसलिए फिल्म वर्गीकरण पर मूंगफली गैलरी से कोई टिप्पणी नहीं! :):
(स्रोत: 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
अपने वर्तमान विषय में फ़ाइल में नौसिखिया के लिए अधिक संभावना है ।
यह कैसे मदद करता है।