• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SQLに条件を追加したいのですが方法が分かりません)

SQLに条件を追加する方法とは

このQ&Aのポイント
  • SQLに条件を追加する方法について分かりません。具体的な手順を教えてください。
  • WordPressのSQL文に条件を追加する方法を知りたいです。どのようにすればいいですか?
  • SQL文に条件を追加する方法を教えてください。具体的なコード例も教えていただけると助かります。

質問者が選んだベストアンサー

  • ベストアンサー
  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.104

【cron その6】 ・下記コードで自動的にファイルを読み込む、wp-load.phpというのはすでに設置されているものなのでしょうか? すでに設置されています。 WordPressの最初のフォルダ内にありますので確認してみてください。 ./../../../wp-load.php これを説明しておきます。 最初の「./」は自分のフォルダと言う意味です。 storage_rss.phpを設置した場所、つまりテーマフォルダですね。 次に「../」はひとつ上の階層のフォルダと言う意味です。 テーマフォルダから見てひとつ上の階層はthemesフォルダです。 さらに「../」があるのでそのひとつ上の階層はwp-contentフォルダです。 さらに「../」があるのでそのひとつ上の階層はWordPressのフォルダというわけです。 ・テーブル名の取得をfunctions.phpに移して、functions.phpに再び同じ処理を追加する? そうです。 その同じ部分だけの関数をget_rss_table_name()として追加します。 ・front-page.phpのコードを書き直した理由がよくわからないのですが、具体的にどのようなつくりに変更したのでしょうか?↓ 問題があった行はこれです。 ----front-page.php $rss_table_name = storage_rss(1); ---- 書き直したのはこうです。 ----front-page.php $rss_table_name = get_rss_table_name(1); ---- 呼び出す関数が変わっています。 ただそれだけです。 直されたコードをちょっと見てみました。 移動してはいけないコードが移動してきてますので戻しておいてください。 ----storage_rss.php if (!function_exists('display_maintenance')) { function display_maintenance() { echo <<<maintenance <hr> ただいまメンテナンス中です。<br> しばらく時間をおいてアクセスしてください。 <hr> maintenance; } } ---- 以前からある不要な部分を削除してください。 ----front-page.php //接続 $sql = "SELECT * FROM {$rss_table_name} ORDER BY date DESC LIMIT %d,%d"; $query = $wpdb->prepare($sql, $rss_offset, $rss_per_page); $rss_items = $wpdb->get_results($query); ---- 同じ処理が少し下の方にあるので、ここは不要です。

php_learn
質問者

お礼

https://okwave.jp/qa/q10013003.html 質問の期限が切れてしまったようです。続きはこちらからよろしくお願い致します。

php_learn
質問者

補足

【cron その6】 ・下記コードで自動的にファイルを読み込む、wp-load.phpというのはすでに設置されているものなのでしょうか? すでに設置されています。 WordPressの最初のフォルダ内にありますので確認してみてください。 A.確認したところ存在しておりました。ありがとうございます。 問題があった行はこれです。 ----front-page.php $rss_table_name = storage_rss(1); ---- 書き直したのはこうです。 ----front-page.php $rss_table_name = get_rss_table_name(1); ---- 呼び出す関数が変わっています。 ただそれだけです。 A.関数だけ書き換えたのですね。説明ありがとうございます。 cron化は初めてで大がかりな修正が必要なのか心配でしたが、とても勉強になりました。ありがとうございます。 次はカテゴリーページを作成していきたいのですが、通常のカテゴリーページと別に、 カテゴリーのクリックランキングを表示したいと思っております。Ajaxを使いクリック回数をカウントしてphpに上位20件のカテゴリー名を出力させる コードを組んでいるのですが、固定ページの記事1つ1つにもカテゴリーを表示させる予定のため、設計がまだしっかり決まっていない状態です。 SQLを使いカテゴリーコンテンツを表示しながら、カテゴリークリックランキング(上位20件数)を表示するには下記の方法でも可能でしょうか? ※ボットの判別や2重クリック防止など対策が必要なためPHPではなくAjaxカウントを使うことにしました。 __________________________________________________________________________________________________________________________ category.php //タグID取得(single_rss_feedのみ) $tag = get_tags(array('meta_key' => 'single_rss_feed')); $tag_id = $tag->term_id; <?= file_exists('count_' . $tag_id) ? @file_get_contents('count_' . $tag_id) : 0 ?> //クリック数を取得 $(document).on('click','.category_button',function(){//ボタンクリックが行われたとき var $target = $(this);//(this)が代入される var count = Number($target.find('.good_counter').html())+1;//「find()」は、対象となる要素から下にある階層をすべて辿って目的の「子要素」を取得することができるメソッド jQuery.ajax({ url: '<?=admin_url('admin-ajax.php')?>', type: 'POST', data: { 'action' : 'count_up', 'postID' : $target.data('id') }, success: function(data) { $('.good_counter').html(count); } }); return false; }); ___________________________________________________________________________________________________________________________ category-count.php $file = 'count_' . $tagID; $fp = fopen($file, 'c+'); flock($fp, LOCK_EX); if (($cnt = fread($fp, 1024)) === false) $cnt = 0; $cnt++; ftruncate($fp, 0); rewind($fp); fwrite($fp, $cnt); flock($fp, LOCK_UN); die($cnt);

その他の回答 (103)

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.103

【cron その5】 ・cron化するのはRSSの接続から取得、そして格納まで、表示はPHPで行うという事でしょうか? そうです。 表示はfront-page.phpなどで行ないます。

php_learn
質問者

補足

ありがとうございます。

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.102

【cron その4】 削除できたようで、順調です。 それでは、RSSの保存処理をこちらへ移動させていきましょう。 まずは、storage_rss.phpのテストコードは全部削除していただき、以下のようにしてください。 ----storage_rss.php require_once './../../../wp-load.php'; /* RSSの保存 引数(テンプレート番号) */ storage_rss(1); ---- 少し説明しておきます。 最初のrequire_onceは$wpdbを使うための準備です。 storage_rss(1)はfront-page.phpから持ってきた処理です。 ----front-page.php $rss_table_name = storage_rss(1); ---- ですが、$rss_table_nameは不要なので戻り値の受け取りはなくしています。 つぎに、functions.phpから以下の関数を切り取って、そのままこちらに貼り付けてください。 storage_rss() delete_old_rss() get_rss_site_url() その中のstorage_rss()から以下の行を削除してください。 ---- return $rss_table_name; // RSSテーブル名を返す ---- front-page.phpでテーブル名が必要なため返していましたが、そこからは呼ばれなくなり返す必要がなくなったためです。 functions.phpからいろいろと切り取ったためひとつ問題があります。 ----front-page.php $rss_table_name = storage_rss(1); ---- storage_rss()がなくなったためテーブル名が取得できなくなりました。 このかわりになるものをfunctions.phpに追加します。 ----functions.php function get_rss_table_name($template_number) { if (1 == $template_number) { $rss_table_name = 'single_rss_feed'; } elseif (2 == $template_number) { $rss_table_name = 'duuble_rss_feed'; } elseif (3 == $template_number) { $rss_table_name = 'triple_rss_feed'; } return $rss_table_name; } ---- 先ほど切り取って貼り付けたstorage_rss()の中に同じ処理があるのでそのままコピーしてきたものです。 同じ処理なので本来ならどこか一か所だけに書きたいのですが、いい案が思いつかないためやめておきます。 それで、問題のあった行を、追加したget_rss_table_name()を呼ぶようにします。 ----front-page.php $rss_table_name = get_rss_table_name(1); ---- ごちゃごちゃな説明になってしまいましたが、やってみてください。 できたら、またcronに設定してRSSが登録されているか確認してみてください。

php_learn
質問者

補足

RSSは登録されているようです、ありがとうございます。 今までの話をまとめてみます。下記コードで自動的にファイルを読み込む、wp-load.phpというのはすでに設置されているものなのでしょうか? 該当コードに現在のコードをまとめてみました。 require_once './../../../wp-load.php'; 下記のコードをfunctions.phpからstrong.phpに移す、その際にreturn $rss_table_name; を削除する。 テーブル名の取得をfunctions.phpに移して、functions.phpに再び同じ処理を追加する? front-page.phpのコードを書き直した理由がよくわからないのですが、具体的にどのようなつくりに変更したのでしょうか?↓ ↓ 問題のあった行を、追加したget_rss_table_name()を呼ぶようにします。 storage_rss() delete_old_rss() get_rss_site_url() ----front-page.php $rss_table_name = get_rss_table_name(1); ---- ※該当コード https://wandbox.org/permlink/LXOjEr0CutAXsCv9

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.101

【cron その3】 テーマフォルダのフルパス、ありがとうございます。 確認できましたので、追加した一行は削除しておいてください。 それでは、カラフルボックスのcronのコマンドには、以下のように入力することにします。 ---- /usr/bin/php /home/peofreot/public_html/wp-content/themes/sample_theme/storage_rss.php ---- テーマフォルダのパスの後ろに/で区切って「storage_rss.php」を付けていますが、これが実行するスクリプトファイル名です。 テーマフォルダ内にこの名前で新しいファイルを作成してください。 内容は以下のコードにします。 ----storage_rss.php <?php require_once './../../../wp-load.php'; $rss_table_name = 'single_rss_feed'; $sql = "DELETE FROM {$rss_table_name} WHERE date < %s"; $delete_date = date('Y-m-d H:i:s'); $query = $wpdb->prepare($sql, $delete_date); $wpdb->query($query); ---- まずはcronからこのプログラムが実行されるかどうかを確認するためのテストプログラムです。 処理内容としては、RSSテーブルから現在日時以前のものを削除しています。 結果的に全レコードが削除されていれば、正常に実行されたと判断していいと思います。 カラフルボックスのcronの設定画面で、先ほど決めたコマンドと、時間を設定してみてください。 時間は、テストなので、5分おき、にでもしておきましょう。 あとは、5分後にphpMyAdminでレコードが削除されているかを確認してみてください。 確認ができたら、cronの設定をいったん削除しておいた方がいいかもしれません。 一時停止があればそれでもかまいません。 完成まではこまめに止めておいた方がいい理由は、失敗している場合は無駄に繰り返されますし、成功していてもまだプログラムを書きかえていくのでその最中にタイミング悪く実行されるのを防ぐためです。 もしかしたら、一回だけ実行、と言う設定ができるかも知れないので、それであれば削除や停止は不要です。

php_learn
質問者

お礼

何となくコードの書き方はわかったのですが、まずは何からコードの変更を行えば良いのでしょうか? 1点だけ確認したいのですが、cron化するのはRSSの接続から取得、そして格納まで、表示はPHPで行うという事でしょうか?

php_learn
質問者

補足

【cron その3】 ----storage_rss.php <?php require_once './../../../wp-load.php'; $rss_table_name = 'single_rss_feed'; $sql = "DELETE FROM {$rss_table_name} WHERE date < %s"; $delete_date = date('Y-m-d H:i:s'); $query = $wpdb->prepare($sql, $delete_date); $wpdb->query($query); ---- A.記事を削除することができました。ありがとうございます。cronは正常に動作しているようです。停止がないためコマンド削除いたしました。

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.100

【cron その2】 フォルダまでのパス、ありがとうございます。 これは途中からのような気がします。 以下の一行を一番上に追加して確認してみてください。 ----front-page.php echo __DIR__; ---- /optとか/usrとか/varとかから始まると思います。

php_learn
質問者

補足

ありがとうございます。確認したところ下記のように表示されています。 /home/peofreot/public_html/wp-content/themes/sample_theme

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.99

【cron その1】 ・コードを変える場合どこを変更すればいいのでしょうか? Linux特有の書き方があるのでしょうか? コードを変えるのはもう少し先になるので今はそのままでいいです。 Linux特有の書き方はないと思ってください。 まったくないわけではありませんが、おそらくそのような書き方をすることはないと思います。 それではcron化の話しをすすめていきたいと思います。 以前の回答で、cronの設定のコマンドの記述例をあげました。 ---- /usr/local/opt/php/bin/php /usr/local/var/www/htdocs/storage_rss/storage_rss.php ---- まずは前半の「/usr/local/opt/php/bin/php」の部分ですが、ここはPHPの実行ファイルのフルパスです。 カラフルボックスのサイトに情報がありました。 https://help.colorfulbox.jp/manual/pass-list/ こちらの各種パス一覧にはPHPのパスが以下のように書かれています。 ==== /usr/bin/php 各バージョンのパス /opt/cpanel/ea-php53/root/usr/bin/php /opt/cpanel/ea-php54/root/usr/bin/php /opt/cpanel/ea-php55/root/usr/bin/php /opt/cpanel/ea-php56/root/usr/bin/php /opt/cpanel/ea-php70/root/usr/bin/php /opt/cpanel/ea-php71/root/usr/bin/php /opt/cpanel/ea-php72/root/usr/bin/php ==== なんとなくですが、一番上の「/usr/bin/php」が現在使用中のPHPのバージョンのパスへリンクされている気がするので、ひとまずこれでやってみたいと思います。 うまくいかなかった場合は、PHPのバージョンを確認してそのパスを指定することにしましょう。 つぎは後半の「/usr/local/var/www/htdocs/storage_rss/storage_rss.php」の部分ですが、ここは実行したいPHPスクリプトファイルのフルパスです。 ひとまず、WordPressのテーマフォルダ内に配置して、うまくいくか試してみたいと思います。 そこで調べていただきたいのですが、WordPressのテーマフォルダのフルパスがわかりますか。

php_learn
質問者

補足

説明ありがとうございます。フォルダまでのパスは下記になります。 public_html/wp-content/themes/sample_theme

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.98

【コメント欄 その61】 ・送信するときに入力項目があるため投稿オブジェクトから取得が可能ということでしょうか? WP_Post のメンバー変数に記載があるため改めて取得する必要がないということでしょうか? どちらかと言うと後者です。 single.php実行時点では$postに現在の投稿オブジェクトが入っています。 この処理までにWordPressが自動でデータベースから読み込んで投稿オブジェクトを生成してくれています。 前後の投稿はget_adjacent_post()で取得している投稿オブジェクトです。 これもget_adjacent_post()の内部でデータベースから読み込んで投稿オブジェクトを生成してくれます。 メンバー変数にあるものがデータベースから読み込んでいる項目です。 ・cron化を導入するタイミングがわからないためアドバイスを頂きたいです。 まず、WordPressのcronか、Linuxのcronか、ですね。 WordPressのcronであれば、先にcron化した方がいいと思います。 Linuxのcoronであれば、ローカル環境で実行されているかどうかによります。 ローカル環境で実行されていなければ、先にcron化した方がいいと思います。 cron化を後回しにするのは、私のような場合だけでいいと思います。 私はローカル環境のWindowsで実行しているため、Linuxのcronが使えません。 かわりの方法はいくつかあるのでそれは問題ありません。 ですが、質問者さまが私と同じでしたら、Linux(レンタルサーバー)にcronを、Windows(ローカル)にスケジュールを、それぞれに設定することになり煩雑になるのでcron化は最後でいいかなと思います。

php_learn
質問者

補足

single.php実行時点では$postに現在の投稿オブジェクトが入っています。 この処理までにWordPressが自動でデータベースから読み込んで投稿オブジェクトを生成してくれています。 前後の投稿はget_adjacent_post()で取得している投稿オブジェクトです。 これもget_adjacent_post()の内部でデータベースから読み込んで投稿オブジェクトを生成してくれます。 メンバー変数にあるものがデータベースから読み込んでいる項目です。 A.解説ありがとうございます。理解することができました。 ローカル環境で実行されていなければ、先にcron化した方がいいと思います。 A.先にcron化してみようと思います。 RSSの接続から削除→保存までをcronするということになると思うのですが、初めてなのでどうすればいいのかよくわかりません。 コードを変える場合どこを変更すればいいのでしょうか? Linux特有の書き方があるのでしょうか? ※参考サイト https://tutorialmore.com/questions-1400573.htm ※ファイル一覧 https://wandbox.org/permlink/eZCK71nufNMPHcQz

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.97

【コメント欄 その60】 ・タイトルと日付けを出力するコードを組んでみたのですが、表示する方法がわかりません。 投稿のタイトルと日付ですね。 $post_red、$post_blue、$post_greenは投稿オブジェクトです。 投稿オブジェクトがタイトルや日付を持っているので、改めて取得する必要はありません。 参照の方法は、「投稿オブジェクト->メンバー変数」です。 赤投稿のタイトルであれば、$post_red->post_title、です。 青投稿の日時であれば、$post_blue->post_date、です。 投稿オブジェクトのメンバー変数についてはこちらを確認してください。 https://wpdocs.osdn.jp/%E3%82%AF%E3%83%A9%E3%82%B9%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/WP_Post どこにどのように表示したいのかわからないので、とりあえず、各チームのコメントの見出しとして表示してみました。 コードはGitHubのmin_themeを参照してください。 ・投稿者の名前が未入力の際に匿名とつけることは可能でしょうか? 2,コメントの前にナンバリングの数字を付けたいのですが、かなり難しいことだと思っています。 こちらは可能でしょうか? 可能です。 min_themeで対応しておきました。 投稿者の名前があればそのままを、なければ「匿名」を、コメントの次に表示しています。 ナンバリングについては、<ul>タグを<ol>タグに変更して対応していますので各チームで1から始まります。 もし全チーム通しでナンバリングしたいようでしたらそのように対応します。

php_learn
質問者

補足

【コメント欄 その60】 投稿のタイトルと日付ですね。 $post_red、$post_blue、$post_greenは投稿オブジェクトです。 投稿オブジェクトがタイトルや日付を持っているので、改めて取得する必要はありません。 参照の方法は、「投稿オブジェクト->メンバー変数」です。 赤投稿のタイトルであれば、$post_red->post_title、です。 青投稿の日時であれば、$post_blue->post_date、です。 A.回答ありがとうございます。送信するときに入力項目があるため投稿オブジェクトから取得が可能ということでしょうか? WP_Post のメンバー変数に記載があるため改めて取得する必要がないということでしょうか? どこにどのように表示したいのかわからないので、とりあえず、各チームのコメントの見出しとして表示してみました。 コードはGitHubのmin_themeを参照してください。 A.ありがとうございます。コードを使わせていただきました。ナンバリングは求めていたものだったので問題ありません。 数える際にテーブルからの情報が必要だと思っていたのですが、そうでもないのですね。 もう1点お聞きしたいのですが、これから投稿ページレイアウト、カテゴリーページ、アーカイブページ、cron化と進めていきたいのですが。 先にcron化を済ませてからほかのページを作成するべきでしょうか?  1度ほかのページを作成してからcron化に合わせてコードを修正するべきでしょうか? cron化を導入するタイミングがわからないためアドバイスを頂きたいです。

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.96

【コメント欄 その59】 ・コメントを承認制にしていきたいのですが、それは可能なのでしょうか? 「設定」-「ディスカッション」-「コメント表示条件」で設定できそうです。 「コメントの手動承認を必須にする」をオンにして、「すでに承認されたコメントの投稿者のコメントを許可し、それ以外のコメントを承認待ちにする」をオフにすればよさそうです。

php_learn
質問者

補足

ありがとうございます。設定を変更したところ承認制にすることができました。 下記の文でタイトルと日付けを出力するコードを組んでみたのですが、表示する方法がわかりません。 $argsを通す必要があるのでしょうか?$argsというのはテーブルを操作しているという認識であってますでしょうか? 2点ほど先に聞いておきたいのですが、 1,投稿者の名前が未入力の際に匿名とつけることは可能でしょうか? 2,コメントの前にナンバリングの数字を付けたいのですが、かなり難しいことだと思っています。 こちらは可能でしょうか? ※コメントを出力しているコード $args['post_id'] = $post_red->ID; /* 赤のID */ $comments_red = get_comments($args); /* 赤のコメント */ $args['post_id'] = $post_blue->ID; /* 青のID */ $comments_blue = get_comments($args); /* 青のコメント */ $args['post_id'] = $post_green->ID; /* 緑のID */ $comments_green = get_comments($args); /* 緑のコメント */ ____________________________________________________________ ※ここから作成したコード /*$post_title = get_post_title($post);//画像の投稿データから画像IDを取得する ※おそらくいらない */ $red_post_title = get_post_title($post_red);//赤、青、緑の投稿データから前後の画像IDを取得する $blue_post_title = get_post_title($post_blue); $green_post_title = get_post_title($post_green); $red_post_time = get_post_time($post_red);//赤、青、緑の投稿データから前後の画像URLを取得する $blue_post_time = get_post_time($post_blue); $green_post_time = get_post_time($post_green);

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.95

【コメント欄 その58】 ・3つとも同じものが表示されます。 添付画像は別々のものが表示されているように見えます。

php_learn
質問者

補足

失礼致しました。 3つとも同じ順番でしたので、同じものが表示されていると勘違いしました。 記事を6件に増やしてみたところ、コメントなしと表示されており、 目標のコメント欄を再現することができました。 ありがとうございます。 今から、表示項目を名前、投稿日、コメントに変更してみます。 コメントを承認制にしていきたいのですが、それは可能なのでしょうか?

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.94

【コメント欄 その56】 var_dump()の結果、ありがとうございます。 おかげで原因がわかりました。 私のカスタムフィールドの設定画像をもう一度見てください。 名前が「team」で値が「red」になっていると思います。 いただいたvar_dump()の結果を見ると、名前が「green」になっているようです。 名前を「team」で値が「green」にしてみてください。 「red」や「blue」も同様にしてみてください。

php_learn
質問者

補足

勘違いしていたようです。すみません。 修正してみたのですが、やはりだめでした… 3つとも同じものが表示されます。 ※表示画面 https://imgur.com/KMPM5f4.jpg ※var_dump()の結果 投稿テスト1array(15) { ["_edit_last"]=> array(1) { [0]=> string(1) "1" } ["_edit_lock"]=> array(1) { [0]=> string(12) "1653970859:1" } ["team"]=> array(1) { [0]=> string(3) "red" } ["_thumbnail_id"]=> array(1) { [0]=> string(5) "12115" } ["_wp_page_template"]=> array(1) { [0]=> string(7) "default" } ["_aioseo_title"]=> array(1) { [0]=> NULL } ["_aioseo_description"]=> array(1) { [0]=> NULL } ["_aioseo_keywords"]=> array(1) { [0]=> string(0) "" } ["_aioseo_og_title"]=> array(1) { [0]=> NULL } ["_aioseo_og_description"]=> array(1) { [0]=> NULL } ["_aioseo_og_article_section"]=> array(1) { [0]=> string(0) "" } ["_aioseo_og_article_tags"]=> array(1) { [0]=> string(0) "" } ["_aioseo_twitter_title"]=> array(1) { [0]=> NULL } ["_aioseo_twitter_description"]=> array(1) { [0]=> NULL } ["_pv_count_month"]=> array(1) { [0]=> string(15) "a:1:{i:13;i:2;}" } }

関連するQ&A