Phát triển Plugin tìm kiếm Wordpress - Thực tiễn tốt nhất


7

Tìm kiếm khoảng hai ngày để tìm câu trả lời cho câu hỏi của tôi, cuối cùng tôi đã đăng ký StackExchange này. :)

Câu hỏi của tôi không đơn giản, vì vậy tôi cần bắt đầu ngay từ đầu. Nhưng để cho bạn biết ý nghĩa của bài đăng này: Trong khi đó Plugin của tôi đang hoạt động, nhưng tôi không thích mã này. Tôi nghĩ rằng có nhiều cách tốt hơn để giải quyết vấn đề này và vì vậy tôi đang tìm kiếm ninja wordpress, người có thể giúp tôi với những gợi ý tốt và thực hành tốt nhất. Tôi thực sự cố gắng để vào sâu trong wordpress, nhưng nó là loại khó. Cảm ơn bạn trước!


Plugin của tôi nên làm gì

Người dùng Plugin này có thể sử dụng một mã ngắn để hiển thị một hình thức tìm kiếm cho các loại bài đăng cụ thể. Plugin chỉ cần thiết trên các trang có chứa shortcode này.

Các loại bài đăng được tạo thông qua trang cài đặt plugin. Mỗi bài đăng thuộc loại này có tiêu đề, nội dung và một số trường tùy chỉnh từ plugin acf. Có một shortcode cho mỗi loại bài. Biểu mẫu tìm kiếm có một trường để tìm kiếm tất cả các trường bài đăng của loại bài đăng được chỉ định. Hai cái còn lại có thể được sử dụng để giới hạn kết quả bằng hai từ khóa (ví dụ: vị trí, là trường acf).

Các kết quả được tải thông qua ajax và hiển thị bên dưới mẫu tìm kiếm.


Tôi đã làm gì rồi

Tôi cố gắng giữ câu hỏi này không quá lớn. Vì vậy, tôi không chỉ định từng khía cạnh. Sau đây nên hoạt động tốt:

  • Tạo loại bài đăng trong tệp php của plugin. Hiện tại, một loại bài tĩnh là enaugh.
  • Tạo một shortcode in biểu mẫu tìm kiếm và một thùng chứa trống cho kết quả.
  • Yêu cầu Ajax đang hoạt động thông qua javascript và cho kết quả như mong đợi.

Tìm kiếm trường tùy chỉnh

Điều này khá khó khăn, nhưng tôi đã tìm thấy một đoạn mã làm việc và tôi hiểu nó đang làm gì. Vấn đề ở đây là, tôi chỉ muốn tìm kiếm các trường acf với mẫu tìm kiếm cụ thể của mình. Tôi không muốn chạm vào tìm kiếm của trang web hiện có.

Đầu tiên tôi đã thử kiểm tra trang web nào mà người dùng đang truy cập và sử dụng câu lệnh if với is_page () trước khi tôi sửa đổi truy vấn tìm kiếm. Nhưng khi tôi sử dụng ajax, điều này dường như không hiệu quả với tôi ở đây ...

Cách giải quyết của tôi là đặt một biến toàn cục ở đầu mỗi truy vấn tìm kiếm ajax. Bây giờ tôi kiểm tra xem biến này có được đặt trước khi tôi sửa đổi truy vấn tìm kiếm không. Khi kết thúc hàm ajax, tôi đặt biến này thành false. Vâng, tôi nghĩ có một cách tốt hơn để giải quyết vấn đề này, nhưng tôi không biết làm thế nào ...

Các chức năng sửa đổi truy vấn tìm kiếm của tôi là như sau:

/ **
 * Mở rộng tìm kiếm WordPress để bao gồm các trường tùy chỉnh
 *
 * http://adambalee.com
 * /

/ **
 * Tham gia bài viết và bảng postmeta
 *
 * http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_join
 * /
hàm cf_search_join ($ tham gia) {
    $ wpdb toàn cầu;
    // $ cwlistpage = (is_page ('danh sách'));

    kiểm tra $ toàn cầu;
    $ cwlistpage = $ kiểm tra;

    if ($ cwlistpage) {    
        $ tham gia. = 'LEFT THAM GIA'. $ wpdb-> postmeta. ' TRÊN '. $ wpdb-> bài đăng. '.ID ='. $ wpdb-> postmeta. '.post_id';
    }

    trả lại $ tham gia;
}
add_filter ('post_join', 'cf_search_join');

/ **
 * Sửa đổi truy vấn tìm kiếm với post_where
 *
 * http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_where
 * /
hàm cf_search_where ($ where) {
    $ pagenow toàn cầu, $ wpdb;
    // $ cwlistpage = (is_page ('danh sách'));

    kiểm tra $ toàn cầu;
    $ cwlistpage = $ kiểm tra;

    if ($ cwlistpage) {
        $ where = preg numplace (
            "/\(\s*".$wpdb->posts.".post_title\s+LIKE\s* (\ '[^ ^' '' '' '' '' '' '' '' '' '' ''
            "(". $ wpdb-> bài đăng. ". post_title THÍCH $ 1) HOẶC (". $ wpdb-> postmeta. ". meta_value THÍCH $ 1)", $ where);
    }

    trả lại $ ở đâu;
}
add_filter ('post_where', 'cf_search_where');

/ **
 * Ngăn ngừa trùng lặp
 *
 * http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_distotype
 * /
hàm cf_search_distinc ($ where) {
    $ wpdb toàn cầu;
    // $ cwlistpage = (is_page ('danh sách'));

    kiểm tra $ toàn cầu;
    $ cwlistpage = $ kiểm tra;

    if ($ cwlistpage) {
        trả lại "DISTINCT";
    }

    trả lại $ ở đâu;
}
add_filter ('post_distotype', 'cf_search_distotype');

Giới hạn kết quả theo các trường tùy chỉnh

Tất cả các lĩnh vực của hình thức là tùy chọn. Một hình thức trống sẽ trả về tất cả các bài viết của loại bài đăng này. Trường đầu tiên nên tìm kiếm mọi lĩnh vực của bài viết cho từ khóa. Trường thứ hai và thứ ba nên giới hạn kết quả cho trường có chứa từ khóa này. Tôi đã giải quyết điều này bằng if-statement và tôi biết phải có một giải pháp tốt hơn.

/**
* Search with AJAX
*/
function cwlist_click_search() {
global $testcheck;
$testcheck = true;

$searchterm = $_POST['query'];
$searchlocation = $_POST['location'];
$searchdegree = $_POST['degree'];

// WP_Query arguments
$args = array (
    'post_type' => 'offers',
    'post_status' => 'publish',
    's' => $searchterm
);

$query = new WP_Query( $args );

ob_start();

// The Loop
if ( $query->have_posts() ) : ?>
  <br><br><p>
   <?php while ( $query->have_posts() ) : $query->the_post();
        if( ($searchlocation == NULL) || in_array(trim(strtolower($searchlocation)), array_map('strtolower', get_field('offer_location')))):
            if( ($searchdegree == NULL) || (trim(strtolower($searchdegree)) === strtolower(get_field('offer_degree')))):?>

     Titel: <?php the_title(); ?> <br>
     Abschluss: <?php the_field('offer_degree'); ?> <br>
     Ort: <?php the_field('offer_location'); ?> <br>
     Anbieter: <?php the_field('offer_provider'); ?> <br>
     <?php if(get_field('offer_subtitle')): ?>
     - <?php the_field('offer_subtitle'); ?> <br>
     <?php endif; ?>
     <br>

    <?php endif; endif; endwhile; ?>
    </p>
<?php else: ?>
    <!-- no posts found -->
    Keine Angebote gefunden
<?php endif;

// Restore original Post Data
wp_reset_postdata();

$content = ob_get_clean();

echo $content;
die();

$testcheck = false;
}
add_action( 'wp_ajax_nopriv_cwlist_click_search', 'cwlist_click_search' );
add_action( 'wp_ajax_cwlist_click_search', 'cwlist_click_search' );

Gỡ lỗi WP

Khi tôi kích hoạt plugin, nhiều dòng như sau xuất hiện ở trang đầu:

Lưu ý: Đang cố gắng lấy thuộc tính của đối tượng không trong C: \ Users \ CWalt \ Documents \ gitlab \ steuerazubi \ wordpress \ wp-gộp \ query.php trên dòng 4520 Lưu ý: Cố gắng lấy thuộc tính của đối tượng không trong C: \ Người dùng \ CWalt \ Documents \ gitlab \ steuerazubi \ wordpress \ wp-gộp \ query.php trên dòng 4522 Lưu ý: Cố gắng lấy thuộc tính của đối tượng không trong C: \ Users \ CWalt \ Documents \ gitlab \ steuerazubi \ wordpress \ wp- bao gồm \ query.php trên dòng 4524 ...

Tôi kích hoạt gỡ lỗi để tạo một plugin tốt. Tôi có thể làm gì sai?


Nhiều loại bài đăng

Bạn có biết một cách tiếp cận tốt để cho phép Người dùng chỉ định nhiều loại bài đăng hơn thông qua phụ trợ wordpress không? Người dùng sẽ có thể tạo các trang tìm kiếm khác nhau cho các loại bài đăng khác nhau thông qua mã ngắn.


Cảm ơn bạn rất nhiều vì đã đọc. Tôi biết ơn về mọi gợi ý nhỏ.

Câu trả lời:


1

Tôi đã đọc toàn bộ bài viết của bạn, tôi chắc chắn không thấy có gì đặc biệt sai với nó, nhưng nghe có vẻ như bạn thất vọng hơn với cách nó được trình bày.

Cá nhân tôi có một nền tảng lập trình hướng đối tượng lớn, nó cho phép tôi thiết lập một cấu trúc và làm cho mã của tôi có thể sử dụng lại được nhiều hơn. Đề nghị của tôi cho bạn sẽ là thử một cách tiếp cận hướng đối tượng cho plugin tiếp theo của bạn hoặc cấu trúc lại plugin này mà bạn đã viết trong câu hỏi ban đầu.

Wordpress Plugin Boiler tấm là những gì tôi chân thành khuyên bạn. Tôi thường bắt đầu bằng cách truy cập wwpb.me để tạo bộ xương plugin cho chính mình có chức năng ngoài cổng, chỉ cần điền vào biểu mẫu, tải xuống và trích xuất vào thư mục plugin của cài đặt wordpress của bạn.

Khi bạn đã có bộ xương đang chạy, tôi khuyên bạn nên đọc hướng dẫn này, đây là một hướng dẫn tuyệt vời về cách xây dựng bộ xương đi bộ mà bạn vừa tải xuống:

Tăng tốc độ phát triển bằng cách sử dụng Plugin WordPress Boilerplate pt1

Trình cắm thêm Plugin WordPress Phần 2: Phát triển Plugin

Trình cắm thêm plugin WordPress Phần 3: Những bước cuối cùng

Sau khi đọc cho mình một cách nhanh chóng, tôi thường muốn tạo một lớp dữ liệu lưu trữ tất cả các truy vấn cơ sở dữ liệu tùy chỉnh của mình, chẳng hạn như:

<?php 

class example_Events_Data {
  private $wpdb;

  public function __construct() {
    global $wpdb;
    $this->wpdb = $wpdb;
  }

  public function get_events($start_date = null, $end_date = null) {
    $query = "SELECT wp_example_event.id, wp_example_event.name, wp_example_event.description, wp_example_event.date, wp_example_event.end_date, wp_example_event_type.id as event_type_id, wp_example_event_type.type as event_type
              FROM wp_example_event
              JOIN wp_example_event_type on wp_example_event.type_id = wp_example_event_type.id
              ORDER BY wp_example_event.name ASC";
    $events = $this->wpdb->get_results($query, ARRAY_A);
    return $events;
  }

Sau đó, để sử dụng cái này bên trong bộ điều khiển quản trị / công khai của bạn, điều đó đơn giản như cách làm:

    <?php

class Example_Events_Admin {

/**
 * The ID of this plugin.
 *
 * @since    1.0.0
 * @access   private
 * @var      string    $plugin_name    The ID of this plugin.
 */
private $plugin_name;

/**
 * The version of this plugin.
 *
 * @since    1.0.0
 * @access   private
 * @var      string    $version    The current version of this plugin.
 */
private $version;

private $data;
private $utils;

/**
 * Initialize the class and set its properties.
 *
 * @since    1.0.0
 * @param      string    $plugin_name       The name of this plugin.
 * @param      string    $version    The version of this plugin.
 */
public function __construct( $plugin_name, $version ) {

    $this->plugin_name = $plugin_name;
    $this->version = $version;
    $this->data = new example_Events_Data();

}

Tôi cũng muốn tạo cho mình một lớp tiện ích chứa các hàm rất phổ biến trong toàn bộ plugin của tôi, chẳng hạn như quy tắc xác thực mẫu, được triển khai và sử dụng theo cách chính xác.

Bạn chỉ cần đưa chúng vào tệp plugin chính của bạn với allow_once và khởi tạo ngay khi cần.

Sử dụng lớp dữ liệu cho phép tôi tập trung tất cả các cuộc gọi dữ liệu của mình ở một nơi và sử dụng chúng trong suốt quá trình phát triển plugin.

Sử dụng các thực hành này đã giảm đáng kể thời gian phát triển của tôi và làm cho các plugin của tôi dễ bảo trì hơn rất nhiều.

Tôi hy vọng bạn tìm thấy câu trả lời này hữu ích!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.