WordPress Admin Search: تمديد النتائج

نشرت: 2021-01-20

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

على سبيل المثال ، إذا قمت بالبحث عن منشور في شاشة إدارة المنشورات ، فستقوم وظيفة البحث افتراضيًا بالبحث عن نص استعلام البحث في عنوان المنشور ، ومقتطفات النشر ، ومحتوى المنشور ، ثم تقوم بإرجاع هذه النتائج. ولكن ، ماذا لو كنت تريد البحث باستخدام كلمات رئيسية مرتبطة بحقل مخصص؟ لا يتم تضمين هذه المعلومات في نتائج البحث في جدول قائمة منشورات الإدارة والتي قد تكون محبطة.

في مقال سابق تعلمنا كيفية إضافة حقل مخصص في أنواع منشوراتنا. دعنا نلقي نظرة على كيفية تضمين حقل مخصص في نتائج البحث أيضًا.

قم بتوسيع استعلام البحث في بحث شاشة المسؤول

في مثالنا العملي على الحقول المخصصة ، أنشأنا حقلاً مخصصًا يسمى "المصدر" في إحدى منشوراتنا وأدخلنا قيمة عنوان URL.

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

لتغيير هذا ، سنحتاج إلى تمديد الخطاف الأصلي الذي يوفره WordPress لميزة البحث. الخطاف الذي يتعين علينا تمديده هو pre_get_posts الذي تم تضمينه في ملف wp-includes/class-wp-query.php حول السطر 1779 داخل وظيفة get_posts .

استعلام WordPress

في كل مرة تقوم فيها بزيارة صفحة ، إما في العرض الأمامي أو منطقة المسؤول ، يتم تنفيذ سلسلة من البرامج النصية للتعليمات البرمجية لإنشاء WP_Query المقابل لطلبك ، إلى جانب خصائصه.

دعنا ننشئ عرضًا مؤقتًا لبعض مخرجات خصائص الاستعلام لفهم التغييرات التي تحدث في كائن WP_Query في كل حالة.

لعرض الاستعلام قبل تنفيذه ، سنلحق الطباعة في خطاف الإجراء pre_get_posts . يتم تشغيل عامل التصفية pre_get_posts بعد إنشاء كائن متغير الاستعلام ، ولكن قبل تشغيل الاستعلام الفعلي.

أدخل هذا الجزء من الكود في ملف functions.php الخاص بالنسق النشط:

 add_action( 'pre_get_posts', 'print_query' ); function print_query( ) { print_r ( $GLOBALS['wp_query']->query ); echo "<hr>"; print_r ( $GLOBALS['wp_query']->query_vars ); echo "<hr>"; }

الآن ، إذا قمت بزيارة شاشة إدارة المنشورات ، فستتم طباعة مخرجات query و query_var s في الأعلى.

لعرض الكود بسهولة أكبر ، يمكنك نسخه ولصقه في مُجمل PHP مجاني عبر الإنترنت.

ستبدو مصفوفة $GLOBALS['wp_query']->query (أولًا) كما يلي:

 Array ( [order] => [orderby] => [post_type] => post [posts_per_page] => 20 [post_status] => [perm] => )

في حالة البحث في شاشة إدارة المنشورات على سبيل المثال ، سيتغير إخراج المصفوفة بما في ذلك سلسلة البحث. إذا بحثنا عن "wordpress.org" على سبيل المثال ، فسيبدو كالتالي:

 Array ( [m] => 0 [cat] => 0 [s] => wordpress.org [paged] => 1 [order] => [orderby] => [post_type] => post [posts_per_page] => 20 [post_status] => [perm] => )

اجمع الكود

مع وضع المعلومات الواردة أعلاه في الاعتبار ، سنقوم بإدخال الكود الصحيح لتحقيق وظيفة البحث التي نطلبها. للقيام بذلك ، عد إلى functions.php السمة النشطة الخاصة بك وحذف الرمز الذي أدخلته قبل لحظات قليلة في الخطوة السابقة. ثم أدخل الرمز أدناه:

 add_action( 'pre_get_posts', 'extend_admin_search' ); function extend_admin_search( $query ) { $post_type = 'post'; $custom_fields = array("source",); if( ! is_admin() ) return; if ( $query->query['post_type'] != $post_type ) return; $search_term = $query->query_vars['s']; $query->query_vars['s'] = ''; if ( $search_term != '' ) { $meta_query = array( 'relation' => 'OR' ); foreach( $custom_fields as $custom_field ) { array_push( $meta_query, array( 'key' => $custom_field, 'value' => $search_term, 'compare' => 'LIKE' )); } $query->set( 'meta_query', $meta_query ); }; }

الخطوة التالية هي تغيير $post_type و $custom_fields إلى قيم تنطبق على متطلباتك. دعونا نرى ما فعلناه في الكود.

  • $post_type = 'post'; - هنا نحدد نوع المنشور الذي نريد البحث فيه.
  • $custom_fields = array("source",); - هنا نحدد الحقول المخصصة التي نريد البحث فيها.

نظرًا لأننا نعمل مع الخطاف pre_get_posts ، فمن المهم التأكد في الكود الخاص بنا من أننا نطبق ملحق البحث المخصص الخاص بنا أثناء تواجدنا في الصفحة الصحيحة. Τ لإخبار WordPress بعرض الكود الخاص بنا في ظل ظروف محددة ، نستخدم بعض العلامات الشرطية.

  • if ( ! is_admin() ) return; يضمن الشرط أنه إذا لم نكن في منطقة المسؤول ، فلن يتم تنفيذ أي من التعليمات البرمجية الخاصة بنا.
  • if ( $query->query['post_type'] != $post_type ) يتحقق مما إذا كنا نعمل على نوع المنشور الذي حددناه في متغير $post_type . في حالتنا ، post .
  • $search_term = $query->query_vars['s']; هو المكان الذي نحتفظ فيه بسلسلة البحث في متغير ثم نقوم بتعيينها على فارغة مرة أخرى $query->query_vars['s'] = ''; وإلا فلن تجد أي شيء.

الآن ، مع وجود هذه التحديثات ، إذا قمت بتحديث البحث الأخير ، فستحصل على النتائج الصحيحة. في حالتنا ، نرى منشور "Post 1" في النتائج والذي يتضمن إدخال حقل مخصص "المصدر": "https: // dev. wordpress.org / مرجع / وظائف / add_post_meta / '.

تحسين البحث الإداري عن ووردبريس

قم بتوسيع استعلام البحث في بحث Front View

الآن قمنا "بإصلاح" بحث المسؤول الخاص بنا ، يمكننا الانتقال إلى تحسين وظيفة البحث الأمامية لدينا حتى يتمكن مستخدمو موقعنا على الويب أيضًا من البحث عن الحقول المخصصة.

بالطريقة نفسها التي لم يُسفر البحث عن "المسؤول" عنها سابقًا عن أي نتائج للحقول المخصصة ، يفشل بحث الواجهة الأمامية أيضًا في إرجاع أي نتائج للحقول المخصصة.

من الناحية المثالية ، نريد أن يتمكن المستخدمون من البحث عن هذه الحقول. في هذا المثال ، لدينا حقل "مصدر" مخصص في إحدى منشوراتنا التي تحتوي حاليًا على عنوان url "https://dev.wordpress.org/reference/functions/add_post_meta/". إذا كان المستخدم يبحث عن "wordpress.org" ، فيجب أن يظهر هذا المنشور في النتائج. دعنا نتعرف على كيفية القيام بذلك.

الرمز المطلوب

توجه إلى ملف functions.php مرة أخرى وانسخ الكود الذي لصقته سابقًا. الآن ، قم بلصق هذا مباشرةً أسفل هذا الرمز (بحيث يكون لديك نسختان من هذا الرمز في functions.php ) الآن ، قم بتغيير اسم الوظيفة في هذا الجزء الثاني من التعليمات البرمجية إلى شيء مثل extend_front_search . يجب أن تبدو هذه:

 add_action( 'pre_get_posts', 'extend_admin_search' ); function extend_admin_search( $query ) { $post_type = 'post'; $custom_fields = array("source",); if( ! is_admin() ) return; if ( $query->query['post_type'] != $post_type ) return; $search_term = $query->query_vars['s']; $query->query_vars['s'] = ''; if ( $search_term != '' ) { $meta_query = array( 'relation' => 'OR' ); foreach( $custom_fields as $custom_field ) { array_push( $meta_query, array( 'key' => $custom_field, 'value' => $search_term, 'compare' => 'LIKE' )); } $query->set( 'meta_query', $meta_query ); }; }

بعد ذلك ، نحتاج إلى إزالة if ( $query->query['post_type'] != $post_type ) return; حالة.

 add_action( 'pre_get_posts', 'extend_front_search' ); function extend_front_search( $query ) { $post_type = 'post'; $custom_fields = array("source",); if( is_admin() ) return; $search_term = $query->query_vars['s']; $query->query_vars['s'] = ''; if ( $search_term != '' ) { $meta_query = array( 'relation' => 'OR' ); foreach( $custom_fields as $custom_field ) { array_push( $meta_query, array( 'key' => $custom_field, 'value' => $search_term, 'compare' => 'LIKE' )); } $query->set( 'meta_query', $meta_query ); }; }

نحتاج فقط إلى الحفاظ على الحالة if( is_admin() ) return; للتأكد من تطبيق الكود فقط في الواجهة الأمامية ونحن على ما يرام.

استراتيجية بديلة

هناك طريقة أخرى لتوسيع بحث WordPress ليشمل الحقول المخصصة وهي تغيير استعلام SQL.

تساعدك فئة WP_Query في ذلك عن طريق تقسيمها إلى أجزاء كما هو موضح حول السطر 2897 من ملف wp-includes/class-wp-query.php .

 $clauses = (array) apply_filters_ref_array( 'posts_clauses_request', array( compact( $pieces ), &$this ) ); $where = isset( $clauses['where'] ) ? $clauses['where'] : ''; $groupby = isset( $clauses['groupby'] ) ? $clauses['groupby'] : ''; $join = isset( $clauses['join'] ) ? $clauses['join'] : ''; $orderby = isset( $clauses['orderby'] ) ? $clauses['orderby'] : ''; $distinct = isset( $clauses['distinct'] ) ? $clauses['distinct'] : ''; $fields = isset( $clauses['fields'] ) ? $clauses['fields'] : ''; $limits = isset( $clauses['limits'] ) ? $clauses['limits'] : '';

كما ذكرنا سابقًا في مقالات الحقول المخصصة ، يتم تخزين جميع بيانات الحقول المخصصة في قاعدة البيانات في جدول "postmeta" الذي لا يتم تضمينه افتراضيًا في بحث WordPress. لذا فإن خطوتنا الأولى هي الانضمام إلى هذين الجدولين باستخدام الكود أدناه:

 function join_meta_table( $join ) { global $wpdb; if ( is_search() ) { $join .=' LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '..post_id '; } return $join; } add_filter('posts_join', 'join_meta_table' );

استخدمنا خطاف posts_join بالطبع لأنه يقوم بتصفية بند JOIN للاستعلام.

بعد ذلك ، سنستخدم الخطاف posts_where لتعديل الجزء WHERE من الاستعلام لتلبية احتياجاتنا.

 function modify_where_clause( $where ) { global $pagenow, $wpdb; if ( is_search() ) { $where = preg_replace( "/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/", "(".$wpdb->posts.".post_title LIKE $1) OR (".$wpdb->postmeta.".meta_value LIKE $1)", $where ); } return $where; } add_filter( 'posts_where', 'modify_where_clause' );

أخيرًا وليس آخرًا ، نحتاج إلى منع التكرارات. لتحقيق ذلك ، نستخدم الخطاف posts_distinct الذي يقوم بتصفية جملة DISTINCT للاستعلام.

 function prevent_duplicates( $where ) { global $wpdb; if ( is_search() ) { return "DISTINCT"; } return $where; } add_filter( 'posts_distinct', 'prevent_duplicates' );

لنرى الآن ما يحدث في الواجهة الأمامية إذا بحثنا عن سلسلة "wordpress.org".

البحث عن ووردبرس في الواجهة الأمامية

كما هو متوقع ، النتائج صحيحة هذه المرة. وجد بحث WordPress "post 1" كنتيجة لأنه يحتوي على حقل "source" بالقيمة "https: // dev. wordpress.org / مرجع / وظائف / add_post_meta /

أنواع المنشورات المخصصة في نتائج بحث WordPress

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

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

 function tg_include_custom_post_types_in_search_results( $query ) { if ( $query->is_main_query() && $query->is_search() && ! is_admin() ) { $query->set( 'post_type', array( 'post', 'books' ) ); } } add_action( 'pre_get_posts', 'tg_include_custom_post_types_in_search_results' );

ما فعلناه هنا هو إضافة أنواع المنشورات المرغوبة لتضمينها في نتائج البحث كوسيطات لخطاف post_type .

إذا كنت ترغب في استبعاد نوع ، فما عليك سوى إزالته من المصفوفة.

استنتاج

يمكن أن يكون تحسين البحث على موقع WordPress الخاص بك مفيدًا حقًا ويوفر الكثير من الوقت. بالنسبة للمستخدم النهائي ، من المهم أيضًا أن يتمكن من البحث عن كل من أنواع المنشورات المخصصة والحقول المخصصة أيضًا. نأمل أن تكون التعليمات المذكورة أعلاه قد أعطتك نظرة ثاقبة حول كيفية تحقيق ذلك على موقع الويب الخاص بك.