質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

WordPress

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

プラグイン

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

Q&A

解決済

1回答

2187閲覧

WordpressでDownloadMonitorで作成したコンテンツを一つの固定ページ内に一覧表示及び検索処理を実装したい

退会済みユーザー

退会済みユーザー

総合スコア0

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

WordPress

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

プラグイン

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

0グッド

0クリップ

投稿2020/02/14 15:14

前提・実現したいこと

現在、WordpressのプラグインDownloadMonitorで作成したコンテンツについて、以下の仕様を満たすページ及び処理を実装している際に詰まってしまったので、ご教授いただけないでしょうか。
①ページを最初に開いた時:DownloadMonitorで作成したコンテンツを全量表示
②検索ボックスでキーワードを入れるとタイトル検索をし、該当するコンテンツを表示
③0件の場合は、検索結果がない旨をを表示
④表示件数が9以上はページネーション

以下実装中のコードです

・一覧ページ

html

1<?php 2/* 3Template Name: ダウンロードモニター 4*/ 5?> 6 7<?php get_header(); ?> 8 <div id="primary" class="content-area"> 9 <main id="main" class="site-main"> 10 <form action="<?php echo dmsearch(); ?>" method="post"> 11 <input type="text" name="dmtitle" placeholder="DMタイトル検索"> 12 <input type="submit" value="検索"> 13 </form> 14 15 <ul> 16 <?php if(count($dmsearchid) >=1): ?> 17 <p><?php echo count($dmsearchid) ?>件見つかりました。</p> 18 <?php foreach($dmsearchid as $did): ?> 19 <?php echo do_shortcode('[download id="'.$did.'"]'); ?> 20 <?php endforeach; ?> 21 <?php else: ?> 22 <p>検索結果は見つかりませんでした。</p> 23 <?php endif; ?> 24 </ul> 25 </main> 26 </div> 27 28 29<?php get_footer(); ?> 30

・function.php(一部抜粋)

html

1function dmsearch(){ 2 global $wpdb; 3 4 $dmtitle = $_POST["dmtitle"]; 5 6 $dmsearchid = $wpdb->get_col( 7 $wpdb->prepare( 8 "SELECT ID FROM $wpdb->posts WHERE post_title=%s AND post_status=%s AND post_type=%s ORDER BY post_date DESC", 9 "%$dmtitle%", 10 "dlm_download", 11 "publish" 12 ) 13 ); 14}

試したこと

・一覧ページのフォームからfunction.phpの関数に入力値を受け渡そうとした。
・function.phpの関数で検索結果のSQLを実行して一覧ページのフォームへ結果を返そうとした。
・DBはWordpressのDBクラスを使用して接続しようとした。

補足情報(FW/ツールのバージョンなど)

・OS:Windows10
・Wordpress5.3.2
・DownloadMonitor 4.4.2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/02/14 23:17

「固定ページ」ではないとならない理由があるのですか?
退会済みユーザー

退会済みユーザー

2020/02/15 01:24

ご返信ありがとうございます。 固定ページであることは仕様で決まっています。
guest

回答1

0

ベストアンサー

ベストなやり方かはわかりませんが、WordPressの仕組みを利用する方法だと以下の様なコードになるのではないでしょうか。

page-list.php

<?php get_header(); ?> <?php /* Start the Loop */ while ( have_posts() ) { the_post(); the_id(); the_title(); } ?> <form role="search" method="get" id="searchform" class="searchform" action=""> <div> <label class="screen-reader-text" for="s"><?php _x( 'Search for:', 'label' ); ?></label> <input type="text" value="<?php echo get_search_query(); ?>" name="s" id="s" /> <input type="submit" id="searchsubmit" value="<?php echo esc_attr_x( 'Search', 'submit button' ); ?>" /> </div> </form> <?php get_footer();

functions.php

add_filter( 'posts_where', 'teratail24140_posts_where', 10, 2 ); function teratail24140_posts_where( $where, $query ) { if ( !is_admin() && $query->is_main_query() ) { if(is_page('list')) { global $wpdb; $s = $_GET['s']; if(isset($s)) { $where = ' AND (' . $wpdb->posts . '.post_title LIKE \'%' . esc_sql($s) . '%\')'; $where .= ' AND (' . $wpdb->posts . '.post_type = \'dlm_download\')'; } else { $where = 'AND (' . $wpdb->posts . '.post_type = \'dlm_download\')'; } } } return $where; }

追記

ページネーションについては、特別にコードを実装しなくとも、通常のページネーションと同じ実装方法でいいと思います。
また、通常の投稿とページごとの表示件数を変えたいのであれば、pre_get_postsでフックして設定してください。

追記2

arasa_engineerさんのコードを修正して、動作だけ確認したので追記しておきます。

page-list.php

PHP

1<form action="" method="get"> 2<input type="text" name="title"> 3<input type="submit" value="検索"> 4</form> 5 6<ul> 7<?php 8 $title = $_GET['title']; 9 foreach(get_studies($title) as $cid){ 10 echo do_shortcode('[download id="'.$cid.'"]'); 11 } 12?> 13</ul>

functions.php

PHP

1function get_studies($title){ 2 global $wpdb; 3 if(isset($title)){ 4 $casestudiesid = $wpdb->get_col( 5 $wpdb->prepare( 6 "SELECT ID FROM $wpdb->posts WHERE post_title like %s AND post_type=%s AND post_status=%s ORDER BY post_date DESC", 7 "%".$title."%", 8 "dlm_download", 9 "publish" 10 ) 11 ); 12 }else{ 13 $casestudiesid = $wpdb->get_col( 14 $wpdb->prepare( 15 "SELECT ID FROM $wpdb->posts WHERE post_type=%s AND post_status=%s ORDER BY post_date DESC", 16 "dlm_download", 17 "publish" 18 ) 19 ); 20 } 21 return $casestudiesid; 22}

投稿2020/02/15 03:53

編集2020/02/20 03:55
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/02/15 06:18

ご返信ありがとうございます。 上記よりSQLを修正(ダウンロードボックスが出る形にする)して試して見ます!
退会済みユーザー

退会済みユーザー

2020/02/15 06:47

ちなみに教えていただいたコードをそのまま使用すると、 ・初期表示時「48ダウンロードモニター」 ・タイトルの部分検索でコンテンツが引っ掛かりませんでした。
退会済みユーザー

退会済みユーザー

2020/02/15 06:56

そうでうすか。私の環境では正常に検索機能が動いたので不思議ですね。
退会済みユーザー

退会済みユーザー

2020/02/17 02:43

返信遅れてしまい申し訳ございません。 既存のコードが影響している可能性もあるので、再度検討してみます。
退会済みユーザー

退会済みユーザー

2020/02/18 02:40 編集

諸事情により、wordpressの標準検索機能ではなく、phpmysqlの機能を使用して実装をすることになりました。現在、初期ページでの全量表示及びfunction.phpへのキーワード受け渡しまでは実装できたのですが、検索時に結果が表示されないというところで躓いております。 ・page-list.php ```html <form action="" method="get"> <input type="text" name="title"> <input type="submit" value="検索"> </form> <ul> <?php $title = $_GET['title']; foreach(get_studies($title) as $cid){ echo do_shortcode('[download id="'.$cid.'"]'); } ?> </ul> ``` ・function.php ``` function get_studies($title){ global $wpdb; if(isset($title)){ $studiesid = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_title like %s AND post_type=%s AND post_status=%s ORDER BY post_date DESC", "%'.$title.'%", "dlm_download", "publish" ) ); }else{ $studiesid = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_type=%s AND post_status=%s ORDER BY post_date DESC", "dlm_download", "publish" ) ); } return $studiesid; } ```
退会済みユーザー

退会済みユーザー

2020/02/18 01:55

SQL文を使うのであれば、 (1)PHPで生成しているSQL文が想定している文になっているかechoしてみる (2)phpMyAdminが使える環境なのであれば、そこで出力したSQL文が正常に動作するか確認する という段階を踏んでから、WordPress上へ組み込んで動かしてみてはいかがでしょうか。
退会済みユーザー

退会済みユーザー

2020/02/18 02:07

今ぱっとコードを見た感じでも、出力されているSQL文にシンタックスエラーがあるように見えます。
退会済みユーザー

退会済みユーザー

2020/02/18 02:56 編集

以下がlast_queryで確認した結果です。\がついているのがおかしいですね。 SELECT ID FROM wp15_posts WHERE post_title like '%\'.テスト.\'%', AND post_type='dlm_download' AND post_status='publish' ORDER BY post_date DESC ちなみに、初期表示した際のSQLは以下となっています。 SELECT post_id, meta_key, meta_value FROM wp15_postmeta WHERE post_id IN (15615) ORDER BY meta_id ASC
退会済みユーザー

退会済みユーザー

2020/02/18 03:10

はい、おかしいので修正してください。
退会済みユーザー

退会済みユーザー

2020/02/18 03:56

"SELECT ID FROM $wpdb->posts WHERE post_title like '%$title%' AND post_type=%s AND post_status=%s ORDER BY post_date DESC", "dlm_download", "publish" こちらで部分一致の結果が取れました。 初歩的なことから教えて頂きありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問