it-swarm.asia

كيفية فرز منطقة المسؤول لنوع منشور مخصص في WordPress حسب حقل مخصص

عند تحرير أحد أنواع منشوراتي المخصصة ، أريد أن أكون قادرًا على إدراج جميع الإدخالات حسب حقل مخصص بدلاً من تاريخ نشرها (والتي ، على الأرجح ، لن يكون نوع المنشور المخصص ذا صلة) حصلت على مقدمة من تعليقات منشور مدونة حول أنواع المنشورات المخصصة وقال المؤلف إن ذلك ممكن وأنه قام بذلك حتى تتمكن من النقر فوق أسماء الأعمدة لترتيب مخصص. ذكر posts_orderby الوظيفة التي أشرت إليها في تعليقاتي الخاصة ، لكن الآن يمكنني العثور على منشور المدونة بعد الآن. أي اقتراحات؟ رأيت أحد الحلول المستخدمة

add_action('wp', 'check_page');

و check_page تستخدم الدالة add_filter لتغيير الاستعلام لكنني متأكد من أنها ستعمل فقط في ملفات السمات ، وليس في منطقة المشرف.

52
tooshel

كما يمكنك أن تتخيل على الأرجح بسبب عدم وجود إجابات مقدمة ، فإن الحل ليس تافهاً تمامًا. ما قمت به هو إنشاء مثال قائم بذاته إلى حد ما يفترض وجود نوع منشور مخصص "movie" ومفتاح الحقل المخصص لـ "النوع".

إخلاء المسؤولية: هذا يعمل مع WP3.0 لكن لا يمكنني التأكد من أنه سيعمل مع الإصدارات السابقة.

تحتاج بشكل أساسي إلى ربط خطافين (2) لجعله يعمل وآخران (2) لجعله واضحًا ومفيدًا.

الخطاف الأول هو "restrict_manage_posts" الذي يتيح لك إرسال كود HTML <select> في المنطقة أعلى قائمة المنشورات حيث "إجراءات مجمعة" و "إظهار التواريخ" المرشحات. ستنشئ الشفرة المقدمة وظيفة "Sort by:" كما هو موضح في مقتطف الشاشة:

How to Create Sort By functionality for a Custom Post Type in the WordPress Admin
(المصدر: mikeschinkel.com )

تستخدم الشفرة SQL مباشرة لأنه لا توجد وظيفة في WordPress API لتوفير قائمة بجميع meta_keys لأنواع النشرات (يبدو وكأنه تذكرة مستقبلية trac لي ...) على أي حال ، إليك الرمز. لاحظ أنه ينتزع نوع المنشور من $_GET ويتحقق من صحته للتأكد من أنه نوع منشور صالح post_type_exists() بالإضافة إلى كونه نوع نشر movie (هذان الشيكتان مفرطان في التقدير لكنني فعلت ذلك لتوضيح لك ما إذا كنت لا تريد إلى التعليمات البرمجية الثابتة لنوع المنشور.) أخيرًا أستخدم معلمة عنوان URL sortby لأنه لا يتعارض مع أي شيء آخر في 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 في المعلمة orderbyquery_posts(). نحن اختبار للتأكد من أن:

  1. نحن في المشرف (is_admin()) ،
  2. نحن على الصفحة التي تسرد المشاركات في المشرف ($pagenow=='edit.php') ،
  3. تم استدعاء الصفحة باستخدام معلمة URL post_type مساوية لـ movie و
  4. تم استدعاء الصفحة أيضًا باستخدام معلمة URL sortby ولم يتم تمريرها بقيمة '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_columns باستخدام print_r() لمعرفة ما هو متاح بشكل افتراضي.)

قررت إضافة "Sorted By:" عندما يكون هناك معلمة عنوان URL 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'. عندما يكون هناك معلمة عنوان URL sortby ، فإننا نستخلص قيمة الحقل المخصص التي يتم فرزها من خلال عرضها في قائمتنا. إليك ما يبدو عليه (تذكر ، هذه بيانات اختبار ، لذا لا توجد تعليقات من معرض الفول السوداني على تصنيفات الأفلام! :):

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

لاحظ أن هذا يلتقط فقط أول "Genre" للحصول على movie ، أي القيمة الأولية الأولى في حالة وجود قيم متعددة لمفتاح معين. لكن مرة أخرى ، لست متأكدًا من الطريقة التي ستعمل بها بطريقة أخرى!

ولأولئك الذين لا يعرفون مكان وضع هذا الرمز ، يمكنك وضعه في مكون إضافي أو على الأرجح للجديد في ملف functions.php في نسختك الحالية.

كيف يساعد هذا.

66
MikeSchinkel

اعتبارًا من الإصدار 3.1 من WordPress (أستخدم الإصدار التجريبي) ، يمكن الآن فرز الأعمدة عبر عناوينها.

تفاصيل المنشور التالي كيفية تنفيذها.

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

8
Leo Plaw