質問編集履歴

4 タイトルをシンプルに変えました。

kaoru-drosera

kaoru-drosera score 23

2020/11/06 06:42  投稿

【wordpress】検索結果を、特定のカスタム投稿タイプの特定のカスタムフィールドに検索キーワードが該当する投稿を優先して並べ替えたい
【wordpress】検索キーワードが該当する投稿を優先して並べ替えたい
### 前提
wordpressを使って、クックパッドのようなサービスを作っています。
具体的には
・ユーザー登録
・ログイン、ログアウト
・レシピの投稿
・いいね、お気に入り機能
・検索機能
などを実装したクックパッドのクローンです。
### webサービスの簡単な仕組み
プラグイン「user frontend」を使い、管理画面外から投稿が可能です。
投稿する項目が必須事項含め複数存在するので投稿には必然的にカスタムフィールドが存在します。
レシピを投稿すると、
カスタムフィールド『article』に、それぞれ
**『レシピ名(recipe_name)』**
**『材料(material)』**
**『作り方(how_to_make)』**
**『コツ・注意点(notice_and_teck)』**
**『きっかけ(trigger)』**
のカスタムフィールドに値が入る仕組みです。
検索を行うと、**『レシピ名』『材料』『作り方』**からキーワードが存在する投稿をloop式で表示します。ちなみに投稿順です。
しかし、『レシピ名』にキーワードがない投稿が上にきてしまうため少し見づらくなっています。
### 実現したいこと
「検索結果を、
**カスタム投稿タイプ『article』の**
**カスタムフィールド『レシピ名(recipe_name)』に**
**『検索したキーワードが存在する投稿が上』になるように**
並べ替えたい。
その上で、カスタムフィールド『レシピ名』『材料』『作り方』でキーワードに該当する投稿も表示したい」
例えば、
「『レシピ名』にキーワードが存在する投稿 今日」
「『レシピ名』にキーワードが存在しない投稿 今日」
「『レシピ名』にキーワードが存在する投稿 昨日」
「『レシピ名』にキーワードが存在しない投稿 昨日」
のような感じです。
### コード
検索結果画面のコードです。
**search.php**
```php
<div class="container">
<p>「<?php the_search_query(); ?>」の検索結果</p>
<div class="flexer">
<ul class="panel recipe_list">
<?php
$args_ct = array(
'post_type' => 'article',
'post_status' => 'publish',
'posts_per_page' => 6,
);
$the_query_ct = new WP_Query($args_ct);
?>
<?php if($the_query_ct->have_posts()): ?>
--- 略 ---
<?php while($the_query_ct->have_posts()): $the_query_ct->the_post();?>
<?php get_template_part('template-parts/loop','article') ?>
<?php endwhile; ?>
<?php else: ?>
<p>検索結果がありません</p>
<?php endif; ?>
</ul>
</div><!-- .flexer -->
</div><!-- .container -->
```
functions.phpの以下コードを使い、「検索対象をカスタム投稿タイプ『article』のカスタムフィールド『recipe_name』『material』『how_to_make』に限定する」処理をしています。
**functions.php**
```php
/* search.phpで検索する範囲を「特定のカスタムフィールド」に限定する */
function custom_search($search, $wp_query) {
global $wpdb;
if (!$wp_query->is_search) return $search;
if (!isset($wp_query->query_vars)) return $search;
$search_words = explode(' ', isset($wp_query->query_vars['s']) ? $wp_query->query_vars['s'] : '');
if ( count($search_words) > 0 ) {
$search = '';
$search .= "AND post_type = 'article'";
foreach ( $search_words as $word ) {
if ( !empty($word) ) {
$search_word = '%'.esc_sql( $word ).'%';
$search .= " AND (
{$wpdb->posts}.post_content LIKE '{$search_word}'
OR {$wpdb->posts}.ID IN (
SELECT distinct post_id
FROM {$wpdb->postmeta}
WHERE {$wpdb->postmeta}.meta_key IN ('recipe_name','material', 'how_to_make') AND meta_value LIKE '{$search_word}'
)
) ";
}
}
}
return $search;
}
add_filter('posts_search','custom_search', 10, 2);
// https://kazunori-miura.tumblr.com/post/189502558056/wordpress%E3%81%AE%E6%A4%9C%E7%B4%A2%E5%AF%BE%E8%B1%A1%E3%82%92%E7%89%B9%E5%AE%9A%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%AE%E5%80%A4%E3%81%AB%E9%99%90%E5%AE%9A%E3%81%99%E3%82%8B
```
このコードだけ見るなら、「$search .= 」からのSQLコードで「特定のカスタム投稿タイプ内のカスタムフィールド」を取得しているようです。
### 試したこと
調べてみると、「『本文(the_content)』に値がある投稿を優先して並べ替える」方法を見つけました。
このコードがヒントになると考えたのですが、応用ができないので挫折している最中です。
**search.php?**
```php
$the_query = new WP_Query( array(
'custom_orderby' => true, // <-追加
) );
```
**functions.php**
```php
function my_posts_orderby( $orderby, $query ) {
global $wpdb;
if ( $query->get( 'custom_orderby' ) ) {
$orderby = "trim({$wpdb->posts}.post_content) = '' DESC, {$wpdb->posts}.post_date DESC";
}
return $orderby;
}
add_filter( 'posts_orderby', 'my_posts_orderby', 10, 2 );
```
具体的には、「カスタム投稿タイプ『article』のカスタムフィールド『recipe_name』の投稿」が取り出せるような応用ができていない状態です。
お時間をいただき、ありがとうございます。
### 補足情報(FW/ツールのバージョンなど)
ブラウザ:chrome(最新のバージョン)
テキストエディタ:atom(ver:1.32.2)
  • SQL

    5659 questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • WordPress

    15502 questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

  • プラグイン

    1315 questions

    プラグイン(plug-in)は、ソフトウェアアプリケーションの機能拡張の為に開発された、一組のソフトウェアコンポーネントのことを指します。

  • 検索

    607 questions

    検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

3 functions.phpの小さな修正と追記を行いました。

kaoru-drosera

kaoru-drosera score 23

2020/11/05 08:40  投稿

【wordpress】検索結果を、特定のカスタム投稿タイプの特定のカスタムフィールドに検索キーワードが該当する投稿を優先して並べ替えたい
### 前提
wordpressを使って、クックパッドのようなサービスを作っています。
具体的には
・ユーザー登録
・ログイン、ログアウト
・レシピの投稿
・いいね、お気に入り機能
・検索機能
などを実装したクックパッドのクローンです。
### webサービスの簡単な仕組み
プラグイン「user frontend」を使い、管理画面外から投稿が可能です。
投稿する項目が必須事項含め複数存在するので投稿には必然的にカスタムフィールドが存在します。
レシピを投稿すると、
カスタムフィールド『article』に、それぞれ
**『レシピ名(recipe_name)』**
**『材料(material)』**
**『作り方(how_to_make)』**
**『コツ・注意点(notice_and_teck)』**
**『きっかけ(trigger)』**
のカスタムフィールドに値が入る仕組みです。
検索を行うと、**『レシピ名』『材料』『作り方』**からキーワードが存在する投稿をloop式で表示します。ちなみに投稿順です。
しかし、『レシピ名』にキーワードがない投稿が上にきてしまうため少し見づらくなっています。
### 実現したいこと
「検索結果を、
**カスタム投稿タイプ『article』の**
**カスタムフィールド『レシピ名(recipe_name)』に**
**『検索したキーワードが存在する投稿が上』になるように**
並べ替えたい。
その上で、カスタムフィールド『レシピ名』『材料』『作り方』でキーワードに該当する投稿も表示したい」
例えば、
「『レシピ名』にキーワードが存在する投稿 今日」
「『レシピ名』にキーワードが存在しない投稿 今日」
「『レシピ名』にキーワードが存在する投稿 昨日」
「『レシピ名』にキーワードが存在しない投稿 昨日」
のような感じです。
### コード
検索結果画面のコードです。
**search.php**
```php
 <div class="container">
   <p>「<?php the_search_query(); ?>」の検索結果</p>
   <div class="flexer">
     <ul class="panel recipe_list">
       <?php
         $args_ct = array(
         'post_type' => 'article',
         'post_status' => 'publish',
         'posts_per_page' => 6,
         );
         $the_query_ct = new WP_Query($args_ct);
        ?>
       <?php if($the_query_ct->have_posts()): ?>
          --- 略 ---
         <?php while($the_query_ct->have_posts()): $the_query_ct->the_post();?>
           <?php get_template_part('template-parts/loop','article') ?>
         <?php endwhile; ?>
       <?php else: ?>
         <p>検索結果がありません</p>
       <?php endif; ?>
     </ul>
   </div><!-- .flexer -->
 </div><!-- .container -->
```
functions.phpの以下コードを使い、「検索対象をカスタム投稿タイプ『article』のカスタムフィールド『recipe_name』『material』『how_to_make』に限定する」処理をしています。
**functions.php**
```php
      /* search.phpで検索する範囲を「特定のカスタムフィールド」に限定する */
      function custom_search($search, $wp_query) {
          global $wpdb;
          if (!$wp_query->is_search) return $search;
          if (!isset($wp_query->query_vars)) return $search;
          $search_words = explode(' ', isset($wp_query->query_vars['s']) ? $wp_query->query_vars['s'] : '');
          if ( count($search_words) > 0 ) {
              $search = '';
              $search .= "AND post_type = 'article'";
              foreach ( $search_words as $word ) {
                  if ( !empty($word) ) {
                      $search_word = '%'.esc_sql( $word ).'%';
                      $search .= " AND (
               {$wpdb->posts}.post_content LIKE '{$search_word}'
                          OR {$wpdb->posts}.ID IN (
                              SELECT distinct post_id
                              FROM {$wpdb->postmeta}
                              WHERE {$wpdb->postmeta}.meta_key IN ('recipe_name','material', 'how_to_make') AND meta_value LIKE '{$search_word}'
                          )
                      ) ";
             if ( $wp_query->get( 'custom_orderby' ) ) {  
                 $orderby = " {$wpdb->posts}.post_content LIKE '{$search_word}'  
             OR {$wpdb->posts}.ID IN (  
               SELECT distinct post_id  
               FROM {$wpdb->postmeta}  
               WHERE {$wpdb->postmeta}.meta_key IN 'recipe_name' AND meta_value LIKE '{$search_word}' = '' DESC, {$wpdb->posts}.post_date DESC ";  
             }  
             return $orderby;  
 
                  }
              }
          }
          return $search;
      }
      add_filter('posts_search','custom_search', 10, 2);
// https://kazunori-miura.tumblr.com/post/189502558056/wordpress%E3%81%AE%E6%A4%9C%E7%B4%A2%E5%AF%BE%E8%B1%A1%E3%82%92%E7%89%B9%E5%AE%9A%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%AE%E5%80%A4%E3%81%AB%E9%99%90%E5%AE%9A%E3%81%99%E3%82%8B
```
 
このコードだけ見るなら、「$search .= 」からのSQLコードで「特定のカスタム投稿タイプ内のカスタムフィールド」を取得しているようです。  
### 試したこと
調べてみると、「『本文(the_content)』に値がある投稿を優先して並べ替える」方法を見つけました。
このコードがヒントになると考えたのですが、応用ができないので挫折している最中です。
**search.php?**
```php
$the_query = new WP_Query( array(
   'custom_orderby' => true,   // <-追加
) );
```
**functions.php**
```php
function my_posts_orderby( $orderby, $query ) {
   global $wpdb;
   if ( $query->get( 'custom_orderby' ) ) {
       $orderby = "trim({$wpdb->posts}.post_content) = '' DESC, {$wpdb->posts}.post_date DESC";
   }
   return $orderby;
}
add_filter( 'posts_orderby', 'my_posts_orderby', 10, 2 );
```
具体的には、「カスタム投稿タイプ『article』のカスタムフィールド『recipe_name』の投稿」が取り出せるような応用ができていない状態です。
お時間をいただき、ありがとうございます。
### 補足情報(FW/ツールのバージョンなど)
ブラウザ:chrome(最新のバージョン)
テキストエディタ:atom(ver:1.32.2)
  • SQL

    5659 questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • WordPress

    15502 questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

  • プラグイン

    1315 questions

    プラグイン(plug-in)は、ソフトウェアアプリケーションの機能拡張の為に開発された、一組のソフトウェアコンポーネントのことを指します。

  • 検索

    607 questions

    検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

2 タイトルにミスがあり修正しました。

kaoru-drosera

kaoru-drosera score 23

2020/11/04 20:06  投稿

【wordpress】検索結果を、特定のカスタムフィールドに検索キーワードが該当する投稿を優先して並べ替えたい
【wordpress】検索結果を、特定のカスタム投稿タイプの特定のカスタムフィールドに検索キーワードが該当する投稿を優先して並べ替えたい
### 前提
wordpressを使って、クックパッドのようなサービスを作っています。
具体的には
・ユーザー登録
・ログイン、ログアウト
・レシピの投稿
・いいね、お気に入り機能
・検索機能
などを実装したクックパッドのクローンです。
### webサービスの簡単な仕組み
プラグイン「user frontend」を使い、管理画面外から投稿が可能です。
投稿する項目が必須事項含め複数存在するので投稿には必然的にカスタムフィールドが存在します。
レシピを投稿すると、
カスタムフィールド『article』に、それぞれ
**『レシピ名(recipe_name)』**
**『材料(material)』**
**『作り方(how_to_make)』**
**『コツ・注意点(notice_and_teck)』**
**『きっかけ(trigger)』**
のカスタムフィールドに値が入る仕組みです。
検索を行うと、**『レシピ名』『材料』『作り方』**からキーワードが存在する投稿をloop式で表示します。ちなみに投稿順です。
しかし、『レシピ名』にキーワードがない投稿が上にきてしまうため少し見づらくなっています。
### 実現したいこと
「検索結果を、
**カスタム投稿タイプ『article』の**
**カスタムフィールド『レシピ名(recipe_name)』に**
**『検索したキーワードが存在する投稿が上』になるように**
並べ替えたい。
その上で、カスタムフィールド『レシピ名』『材料』『作り方』でキーワードに該当する投稿も表示したい」
例えば、
「『レシピ名』にキーワードが存在する投稿 今日」
「『レシピ名』にキーワードが存在しない投稿 今日」
「『レシピ名』にキーワードが存在する投稿 昨日」
「『レシピ名』にキーワードが存在しない投稿 昨日」
のような感じです。
### コード
検索結果画面のコードです。
**search.php**
```php
<div class="container">
<p>「<?php the_search_query(); ?>」の検索結果</p>
<div class="flexer">
<ul class="panel recipe_list">
<?php
$args_ct = array(
'post_type' => 'article',
'post_status' => 'publish',
'posts_per_page' => 6,
);
$the_query_ct = new WP_Query($args_ct);
?>
<?php if($the_query_ct->have_posts()): ?>
--- 略 ---
<?php while($the_query_ct->have_posts()): $the_query_ct->the_post();?>
<?php get_template_part('template-parts/loop','article') ?>
<?php endwhile; ?>
<?php else: ?>
<p>検索結果がありません</p>
<?php endif; ?>
</ul>
</div><!-- .flexer -->
</div><!-- .container -->
```
functions.phpの以下コードを使い、「検索対象をカスタム投稿タイプ『article』のカスタムフィールド『recipe_name』『material』『how_to_make』に限定する」処理をしています。
**functions.php**
```php
/* search.phpで検索する範囲を「特定のカスタムフィールド」に限定する */
function custom_search($search, $wp_query) {
global $wpdb;
if (!$wp_query->is_search) return $search;
if (!isset($wp_query->query_vars)) return $search;
$search_words = explode(' ', isset($wp_query->query_vars['s']) ? $wp_query->query_vars['s'] : '');
if ( count($search_words) > 0 ) {
$search = '';
$search .= "AND post_type = 'article'";
foreach ( $search_words as $word ) {
if ( !empty($word) ) {
$search_word = '%'.esc_sql( $word ).'%';
$search .= " AND (
{$wpdb->posts}.post_content LIKE '{$search_word}'
OR {$wpdb->posts}.ID IN (
SELECT distinct post_id
FROM {$wpdb->postmeta}
WHERE {$wpdb->postmeta}.meta_key IN ('recipe_name','material', 'how_to_make') AND meta_value LIKE '{$search_word}'
)
) ";
if ( $wp_query->get( 'custom_orderby' ) ) {
$orderby = " {$wpdb->posts}.post_content LIKE '{$search_word}'
OR {$wpdb->posts}.ID IN (
SELECT distinct post_id
FROM {$wpdb->postmeta}
WHERE {$wpdb->postmeta}.meta_key IN 'recipe_name' AND meta_value LIKE '{$search_word}' = '' DESC, {$wpdb->posts}.post_date DESC ";
}
return $orderby;
}
}
}
return $search;
}
add_filter('posts_search','custom_search', 10, 2);
// https://kazunori-miura.tumblr.com/post/189502558056/wordpress%E3%81%AE%E6%A4%9C%E7%B4%A2%E5%AF%BE%E8%B1%A1%E3%82%92%E7%89%B9%E5%AE%9A%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%AE%E5%80%A4%E3%81%AB%E9%99%90%E5%AE%9A%E3%81%99%E3%82%8B
```
### 試したこと
調べてみると、「『本文(the_content)』に値がある投稿を優先して並べ替える」方法を見つけました。
このコードがヒントになると考えたのですが、応用ができないので挫折している最中です。
**search.php?**
```php
$the_query = new WP_Query( array(
'custom_orderby' => true, // <-追加
) );
```
**functions.php**
```php
function my_posts_orderby( $orderby, $query ) {
global $wpdb;
if ( $query->get( 'custom_orderby' ) ) {
$orderby = "trim({$wpdb->posts}.post_content) = '' DESC, {$wpdb->posts}.post_date DESC";
}
return $orderby;
}
add_filter( 'posts_orderby', 'my_posts_orderby', 10, 2 );
```
具体的には、「カスタム投稿タイプ『article』のカスタムフィールド『recipe_name』の投稿」が取り出せるような応用ができていない状態です。
お時間をいただき、ありがとうございます。
### 補足情報(FW/ツールのバージョンなど)
ブラウザ:chrome(最新のバージョン)
テキストエディタ:atom(ver:1.32.2)
  • SQL

    5659 questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • WordPress

    15502 questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

  • プラグイン

    1315 questions

    プラグイン(plug-in)は、ソフトウェアアプリケーションの機能拡張の為に開発された、一組のソフトウェアコンポーネントのことを指します。

  • 検索

    607 questions

    検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

1 確認してみると少し見づらかったので修正しました。

kaoru-drosera

kaoru-drosera score 23

2020/11/04 20:04  投稿

【wordpress】検索結果を、特定のカスタムフィールドに検索キーワードが該当する投稿を優先して並べ替えたい
### 前提
wordpressを使って、クックパッドのようなサービスを作っています。
具体的には
・ユーザー登録
・ログイン、ログアウト
・レシピの投稿
・いいね、お気に入り機能
・検索機能
などを実装したクックパッドのクローンです。
### webサービスの簡単な仕組み
プラグイン「user frontend」を使い、管理画面外から投稿が可能です。
投稿する項目が必須事項含め複数存在するので投稿には必然的にカスタムフィールドが存在します。
レシピを投稿すると、
カスタムフィールド『article』に、それぞれ
『レシピ名(recipe_name)』
『材料(material)』
『作り方(how_to_make)』
『コツ・注意点(notice_and_teck)』
『きっかけ(trigger)』
**『レシピ名(recipe_name)』**
**『材料(material)』**
**『作り方(how_to_make)』**
**『コツ・注意点(notice_and_teck)』**
**『きっかけ(trigger)』**
のカスタムフィールドに値が入る仕組みです。
検索を行うと、『レシピ名』『材料』『作り方』からキーワードが存在する投稿をloop式で表示します。ちなみに投稿順です。
検索を行うと、**『レシピ名』『材料』『作り方』**からキーワードが存在する投稿をloop式で表示します。ちなみに投稿順です。
しかし、『レシピ名』にキーワードがない投稿が上にきてしまうため少し見づらくなっています。
### 実現したいこと
「検索結果を、
**カスタム投稿タイプ『article』の**
**カスタムフィールド『レシピ名(recipe_name)』に**
**『検索したキーワードが存在する投稿が上』になるように**
並べ替えたい。
その上で、カスタムフィールド『レシピ名』『材料』『作り方』でキーワードに該当する投稿も表示したい」
例えば、
「『レシピ名』にキーワードが存在する投稿 今日」
「『レシピ名』にキーワードが存在しない投稿 今日」
「『レシピ名』にキーワードが存在する投稿 昨日」
「『レシピ名』にキーワードが存在しない投稿 昨日」
のような感じです。
### コード
検索結果画面のコードです。
search.php
**search.php**
```php
 <div class="container">
   <p>「<?php the_search_query(); ?>」の検索結果</p>
   <div class="flexer">
     <ul class="panel recipe_list">
       <?php
         $args_ct = array(
         'post_type' => 'article',
         'post_status' => 'publish',
         'posts_per_page' => 6,
         );
         $the_query_ct = new WP_Query($args_ct);
        ?>
       <?php if($the_query_ct->have_posts()): ?>
          --- 略 ---
         <?php while($the_query_ct->have_posts()): $the_query_ct->the_post();?>
           <?php get_template_part('template-parts/loop','article') ?>
         <?php endwhile; ?>
       <?php else: ?>
         <p>検索結果がありません</p>
       <?php endif; ?>
     </ul>
   </div><!-- .flexer -->
 </div><!-- .container -->
```
functions.phpの以下コードを使い、「検索対象をカスタム投稿タイプ『article』のカスタムフィールド『recipe_name』『material』『how_to_make』に限定する」処理をしています。
functions.php
**functions.php**
```php
      /* search.phpで検索する範囲を「特定のカスタムフィールド」に限定する */
      function custom_search($search, $wp_query) {
          global $wpdb;
          if (!$wp_query->is_search) return $search;
          if (!isset($wp_query->query_vars)) return $search;
          $search_words = explode(' ', isset($wp_query->query_vars['s']) ? $wp_query->query_vars['s'] : '');
          if ( count($search_words) > 0 ) {
              $search = '';
              $search .= "AND post_type = 'article'";
              foreach ( $search_words as $word ) {
                  if ( !empty($word) ) {
                      $search_word = '%'.esc_sql( $word ).'%';
                      $search .= " AND (
               {$wpdb->posts}.post_content LIKE '{$search_word}'
                          OR {$wpdb->posts}.ID IN (
                              SELECT distinct post_id
                              FROM {$wpdb->postmeta}
                              WHERE {$wpdb->postmeta}.meta_key IN ('recipe_name','material', 'how_to_make') AND meta_value LIKE '{$search_word}'
                          )
                      ) ";
             if ( $wp_query->get( 'custom_orderby' ) ) {
                 $orderby = " {$wpdb->posts}.post_content LIKE '{$search_word}'
             OR {$wpdb->posts}.ID IN (
               SELECT distinct post_id
               FROM {$wpdb->postmeta}
               WHERE {$wpdb->postmeta}.meta_key IN 'recipe_name' AND meta_value LIKE '{$search_word}' = '' DESC, {$wpdb->posts}.post_date DESC ";
             }
             return $orderby;
                  }
              }
          }
          return $search;
      }
      add_filter('posts_search','custom_search', 10, 2);
// https://kazunori-miura.tumblr.com/post/189502558056/wordpress%E3%81%AE%E6%A4%9C%E7%B4%A2%E5%AF%BE%E8%B1%A1%E3%82%92%E7%89%B9%E5%AE%9A%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%AE%E5%80%A4%E3%81%AB%E9%99%90%E5%AE%9A%E3%81%99%E3%82%8B
```
### 試したこと
調べてみると、「『本文(the_content)』に値がある投稿を優先して並べ替える」方法を見つけました。
このコードがヒントになると考えたのですが、応用ができないので挫折している最中です。
search.php?
**search.php?**
```php
$the_query = new WP_Query( array(
   'custom_orderby' => true,   // <-追加
) );
```
functions.php
**functions.php**
```php
function my_posts_orderby( $orderby, $query ) {
   global $wpdb;
   if ( $query->get( 'custom_orderby' ) ) {
       $orderby = "trim({$wpdb->posts}.post_content) = '' DESC, {$wpdb->posts}.post_date DESC";
   }
   return $orderby;
}
add_filter( 'posts_orderby', 'my_posts_orderby', 10, 2 );
```
具体的には、「カスタム投稿タイプ『article』のカスタムフィールド『recipe_name』の投稿」が取り出せるような応用ができていない状態です。
お時間をいただき、ありがとうございます。
### 補足情報(FW/ツールのバージョンなど)
ブラウザ:chrome(最新のバージョン)
テキストエディタ:atom(ver:1.32.2)
  • SQL

    5659 questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • WordPress

    15502 questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

  • プラグイン

    1315 questions

    プラグイン(plug-in)は、ソフトウェアアプリケーションの機能拡張の為に開発された、一組のソフトウェアコンポーネントのことを指します。

  • 検索

    607 questions

    検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る