問題描述

搜索大約兩天來找到我的問題的答案,我終於註冊了這個 StackExchange 。 🙂

我的問題不簡單,所以我需要從一開始就開始。但是給你一個這個帖子的想法:同時我的插件正在工作,但我不喜歡的代碼。我認為有更好的方法來解決這個問題,所以我正在尋找可以幫助我很好的提示和最佳實踐的 wordpress 忍者。我真的試圖深入到 WordPress 的深處,但這很難。先謝謝你!


我的插件應該做什麼

該插件的用户應該能夠使用短碼來顯示特定的帖子類型的搜索表單。該插件僅在包含此短代碼的頁面上需要。

帖子類型是通過插件設置頁面創建的。這種類型的每個帖子都有 acf 插件的標題,內容和幾個自定義字段。每個帖子類型都有一個短碼。搜索表單有一個字段來搜索指定的帖子類型的所有後綴字段。另外兩個可以用於通過兩個關鍵字來限制結果 (例如,位置,這是一個 acf 字段) 。

結果通過 ajax 加載,並顯示在搜索表單下方。


我已經做了

我試圖保持這個問題不要太大。所以我沒有指定每一個方面。以下應該正常工作:

  • 在插件的 php 文件中創建 post 類型。目前一個靜態的帖子類型是 enaugh 。

  • 創建一個打印搜索表單的短代碼,併為結果打印一個空容器。

  • Ajax 請求通過 javascript 工作,並提供預期的結果。


搜索自定義字段

這很難,但是我發現了一個工作的代碼段,我明白了它在做什麼。這裏的問題是,我只想用特定的搜索表單搜索 acf 字段。我不想觸摸現有網站的搜索。

首先,我嘗試檢查用户所在的站點,並在修改搜索查詢之前使用 if-statement 與 is_page() 。但是當我使用 ajax 時,這似乎對我來説不起作用

我的解決方法是在每個 ajax 搜索查詢的開頭設置一個全局變量。現在我在修改搜索查詢之前檢查是否設置了此變量。在我的 ajax 函數結束時,我將此變量設置為 false 。是的,我認為有更好的方法來解決這個問題,但是我不知道如何

修改我的搜索查詢的功能如下:


/**
 * Extend WordPress search to include custom fields
 *
 * http://adambalee.com
 */

/**
 * Join posts and postmeta tables
 *
 * http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_join
 */
function cf_search_join( $join ) {
    global $wpdb;
    //$cwlistpage=(is_page('list'));

    global $testcheck;
    $cwlistpage=$testcheck;

    if ( $cwlistpage ) {
        $join .=' LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id ';
    }

    return $join;
}
add_filter('posts_join', 'cf_search_join' );

/**
 * Modify the search query with posts_where
 *
 * http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_where
 */
function cf_search_where( $where ) {
    global $pagenow, $wpdb;
    //$cwlistpage=(is_page('list'));

    global $testcheck;
    $cwlistpage=$testcheck;

    if ( $cwlistpage ) {
        $where = preg_replace(
            "/(s*".$wpdb->posts.".post_titles+LIKEs*('[^']+')s*)/",
            "(".$wpdb->posts.".post_title LIKE $1) OR (".$wpdb->postmeta.".meta_value LIKE $1)", $where );
    }

    return $where;
}
add_filter( 'posts_where', 'cf_search_where' );

/**
 * Prevent duplicates
 *
 * http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_distinct
 */
function cf_search_distinct( $where ) {
    global $wpdb;
    //$cwlistpage=(is_page('list'));

    global $testcheck;
    $cwlistpage=$testcheck;

    if ( $cwlistpage ) {
        return "DISTINCT";
    }

    return $where;
}
add_filter( 'posts_distinct', 'cf_search_distinct' );

通過自定義字段限制結果

表單的所有字段都是可選的。一個空的表單將返回此帖子類型的所有帖子。第一個字段應該搜索關鍵字的帖子的每個字段。第二個和第三個字段應該將結果限制為包含此關鍵字的結果。我用 if-statements 解決了這個問題,我知道必須有一個更好的解決方案。

/**
* 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' );

WP 調試

當我激活插件時,許多行如下所示出現在首頁:

Notice: Trying to get property of non-object in C:UsersCWaltDocumentsgitlabsteuerazubiwordpresswp-includesquery.php on line 4520 Notice: Trying to get property of non-object in C:UsersCWaltDocumentsgitlabsteuerazubiwordpresswp-includesquery.php on line 4522 Notice: Trying to get property of non-object in C:UsersCWaltDocumentsgitlabsteuerazubiwordpresswp-includesquery.php on line 4524 …

我激活調試來創建一個好的插件。我可能做錯了什麼?


更多帖子類型

你知道一個好的方法讓用户通過 wordpress 後端指定更多的帖子類型嗎?用户應該能夠通過短碼為不同的郵件類型創建不同的搜索頁面。


非常感謝您的閲讀。我感謝每一個小小的提示。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。