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

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

SQLに条件を追加したいのですが方法が分かりません

<?php $search_query = get_search_query(); ?> <?php global $wpdb; ?> <?php $sql = " SELECT COUNT(*) AS all_count FROM wp_posts AS post INNER JOIN ( SELECT * FROM wp_postmeta WHERE meta_key='single_rss_feed1' ) AS feed ON post.ID = feed.post_id LEFT JOIN ( SELECT * FROM wp_postmeta WHERE meta_key = '_thumbnail_id' ) AS thumbnail ON post.ID = thumbnail.post_id LEFT JOIN wp_posts AS attachment ON thumbnail.meta_value = attachment.ID LEFT JOIN ( SELECT category.object_id AS post_id, GROUP_CONCAT(category.name ORDER BY category.term_id) AS category_names, GROUP_CONCAT(category.slug ORDER BY category.term_id) AS category_slugs FROM ( SELECT sub_a.name, sub_a.slug, sub_c.object_id, sub_a.term_id FROM wp_terms AS sub_a LEFT JOIN wp_term_taxonomy AS sub_b ON sub_a.term_id = sub_b.term_id LEFT JOIN wp_term_relationships AS sub_c ON sub_b.term_taxonomy_id = sub_c.term_taxonomy_id WHERE sub_b.taxonomy = 'category' ) AS category GROUP BY category.object_id ) AS category ON post.ID = category.post_id WHERE post.post_type = 'post' AND post.post_status = 'publish' AND post.post_content LIKE %s OR post.post_title LIKE %s OR post.post_excerpt LIKE %s) $query = $wpdb->prepare($sql, "%$search_query%", "%$search_query%", "%$search_query%"); $results = $wpdb->get_results($query); ?> <?php if ($results) : ?> <ul> <?php foreach ($results as $result) : ?> <li> <?php echo "<a href=\"{$result->post_url}\">{$result->post_title}</a>"; echo $result->post_date; echo $result->category_names; if (empty($result->comment_count)) { echo 'コメントなし'; } else { echo "{$result->comment_count}件のコメント"; } echo $result->post_excerpt; echo "<a href=\"{$result->post_url}/#more-{$result->post_id}/\">続きを読む</a>"; if (empty($result->thumbnail_url)) { $result->thumbnail_url = 'noimage.jpg'; } echo "<img src=\"{$result->thumbnail_url}\">"; ?> </li> <?php endforeach; ?> </ul> <?php endif; ?> ※追加したい条件 $categories = []; foreach (get_categories() as $category) { $categories[$category->cat_ID] = $category; } function set_other_data($post) { // アイキャッチIDを取得 $post_thumbnail_id = get_post_thumbnail_id($post); // アイキャッチ画像の確認 if ($post_thumbnail_id) { // 存在する $image_src = wp_get_attachment_image_src($post_thumbnail_id); // サムネイルの画像URLを設定 $post->thumbnail = $image_src[0]; } else { // 存在しない $post->thumbnail = 'noimage.jpg'; } // カテゴリーIDを取得 $post->categories = wp_get_post_categories($post->ID); // コメントテキスト if (0 == $post->comment_count) { // コメントなし $post->comments = __('No Comments'); } else { // コメントあり $post->comments = $post->comment_count.'件のコメント'; } // コメントリンク $post->comments_link = get_comments_link($post->ID); }

  • PHP
  • 回答数104
  • ありがとう数152

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

  • ベストアンサー
  • dell_OK
  • ベストアンサー率13% (735/5620)
回答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% (735/5620)
回答No.103

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

php_learn
質問者

補足

ありがとうございます。

  • dell_OK
  • ベストアンサー率13% (735/5620)
回答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% (735/5620)
回答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% (735/5620)
回答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% (735/5620)
回答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% (735/5620)
回答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% (735/5620)
回答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% (735/5620)
回答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% (735/5620)
回答No.95

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

php_learn
質問者

補足

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

  • dell_OK
  • ベストアンサー率13% (735/5620)
回答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

  • 【WordPress】投稿がないカテゴリ非表示方法

    【WordPress】 投稿がないカテゴリー 非表示 方法 カテゴリーの1つを決め すべての子カテゴリーと投稿を表示させる際に、 子カテゴリー内に投稿がない場合、 子カテゴリー名を表示させないようにしたいです。 下記のソースでうまくいきませんでした。 <?php $chihirdren=get_categories( 'parent=5&hide_empty=0&orderby=slug&order=DESC'); foreach($chihirdren as $child){ ?> <?php if(have_posts()):?> <h2><?php echo $child->cat_name ?></h2> <?php else: // no post ?> <?php endif; ?> <?php $wp_query->query(array('cat'=>$child->cat_ID,'posts_per_page'=>-1)); while ($wp_query->have_posts()) : $wp_query->the_post(); ?> <h3><?php the_title(); ?></h3> <?php endwhile; } ?> 大変申し訳ございません。 ご教授をお願いいたします。。

    • ベストアンサー
    • PHP
  • RSSと投稿記事を交互に表示させたい

    内容の修正が必要ですが原因がわかりません 1.投稿に画像やカテゴリーなどが表示されず、タイトルと日付けのみ表示されている 2.RSS画像にURLがついておらず画像のみ表示されている 3.RSSの画像がない場合ダミー画像を表示させたいが書き方が調べてもわからない <?php $dbh = connect_db(); $categories = []; foreach (get_categories() as $category) { $categories[$category->cat_ID] = $category; } function set_other_data($post) { // アイキャッチIDを取得 $post_thumbnail_id = get_post_thumbnail_id($post); // アイキャッチ画像の確認 if ($post_thumbnail_id) { // 存在する $image_src = wp_get_attachment_image_src($post_thumbnail_id); // サムネイルの画像URLを設定 $post->thumbnail = $image_src[0]; } else { // 存在しない $post->thumbnail = 'noimage.jpg'; } // カテゴリーIDを取得 $post->categories = wp_get_post_categories($post->ID); // コメントテキスト if (0 == $post->comment_count) { // コメントなし $post->comments = __('No Comments'); } else { // コメントあり $post->comments = $post->comment_count.'件のコメント'; } // コメントリンク $post->comments_link = get_comments_link($post->ID); } delete_old_rss($dbh);//接続オブジェクトを渡す //RSS保存 $dbh = connect_db();//① $stmt = $dbh->prepare('insert into rss_feed (title, link, date, img) values (?, ?, ?, ?) on duplicate key update title=?, link=?, date=?, img=?');//② $url1 = get_rss_site_url(); foreach ($url1 as $url) { if (($rss = @simplexml_load_file($url)) === false) { continue; } foreach ($rss->item as $item) { $dc = $item->children('dc', true); $date = date('Y-m-d H:i:s', strtotime($dc->date)); if ($date < $delete_date) { continue; } $title = $item->title; $link = $item->link; $content = $item->children('content', true); $result = preg_match('/<img[^>]*src=\"([^"]+)\"[^>]*>/i', $content->encoded, $matches); if (1 == $result) { $img = $matches[1]; } else { $img = ''; } $stmt->execute([$title, $link, $date, $img, $title, $link, $date, $img]); } } if (ctype_digit($_REQUEST['page'])) { $current_page = (int) $_REQUEST['page']; } else { $current_page = 1; } if ($current_page > $wp_query->max_num_pages) { $current_page = $wp_query->max_num_pages; } $block_per_page = 2; $rss_per_block = 18; $posts_per_block = $wp_query->post_count / $block_per_page; //RSS読み込み $rss_per_page = $block_per_page * $rss_per_block; $rss_offset = ($current_page - 1) * $rss_per_page; $sql = 'SELECT * FROM rss_feed ORDER BY date DESC LIMIT ?,?'; $stmt = $dbh->prepare($sql); $stmt->bindParam(1, $rss_offset, PDO::PARAM_INT); $stmt->bindParam(2, $rss_per_page, PDO::PARAM_INT); $stmt->execute(); $rss_items = $stmt->fetchAll(PDO::FETCH_OBJ); $posts_per_page = $block_per_page * $posts_per_block; $posts_offset = ($current_page - 1) * $posts_per_page; $args = [ 'posts_per_page' => $posts_per_page, 'offset' => $posts_offset, ]; $post_items = get_posts($args); //表示 for ($i = 0; $i < $block_per_page; ++$i) { echo '<h2>ブロック</h2>'; echo '<h3>RSS</h3>'; for ($j = 0; $j < $rss_per_block; ++$j) { $item_index = $i * $rss_per_block + $j; if ($item_index >= count($rss_items)) { break; } $item = $rss_items[$item_index]; echo '<ul>'; echo "<li class=\"sitelink\"><a href=\"{$item->link}\">{$item->title}</a></li>"; echo "<li class=\"sitelink\"><a href=\"{$item->link}\">site</a></li>"; echo "<li class=\"sitedate\">{$item->date}</li>"; if (!empty($item->img)) { echo "<li><img src=\"{$item->img}\" width=\"100\"></li>"; } echo '</ul>'; } echo '<h3>投稿</h3>'; for ($j = 0; $j < $posts_per_block; ++$j) { $item_index = $i * $posts_per_block + $j; if ($item_index >= count($post_items)) { break; } $item = $post_items[$item_index]; echo '<ul>';   echo "<li><a href=\"{$item->guid}\">{$item->post_title}</a></li>"; echo "<li>{$item->post_date}</li>"; echo '</ul>'; } }

    • ベストアンサー
    • PHP
  • 子カテゴリーの条件分岐

    いつもお世話になっております。 WordPressのカテゴリーについてご質問させてください。 カスタム投稿に、該当するカテゴリーを表示する予定です。 しかし、子カテゴリーの選択があれば子カテゴリーのみに。 子カテゴリーの選択がなければ該当する親カテゴリーを表示する分岐の方法が分からず困っています。 現在、子カテゴリーのみ表示になっていますが、ここからどのように分岐すればよいのでしょうか。 ご教授いただけると幸いです。 何卒、宜しくお願いいたします。 <ul> <?php $terms = get_the_terms( $post ->ID, '〇〇-cat' ); foreach( $terms as $term ) { if($term->parent){ echo '<li>'.$term->name.'</li>'; } } ?> </ul>

    • ベストアンサー
    • PHP
  • WordPressの質問(q10006002)の続

    前後の記事のコメント欄を標示する方法がわかりません。 <?php $team = get_post_meta($post->ID, 'team', true);//赤、青、緑のチームに分ける // 投稿オブジェクトの取得 if ('red' === $team) { $post_red = $post; // 赤(現在) $post_blue = get_adjacent_post(true, '', false); // 青(現在の次) $post = $post_blue; // 現在を青に置きかえる $post_green = get_adjacent_post(true, '', false); // 緑(現在の次:青の次) $post = $post_red; // 現在を赤に戻す } elseif ('blue' === $team) { $post_blue = $post; // 青(現在) $post_red = get_adjacent_post(true, '', true); // 赤(現在の前) $post_green = get_adjacent_post(true, '', false); // 緑(現在の次) } elseif ('green' === $team) { $post_green = $post; // 緑(現在) $post_blue = get_adjacent_post(true, '', true); // 青(現在の前) $post = $post_blue; // 現在を青に置きかえる $post_red = get_adjacent_post(true, '', true); // 赤(現在の前:青の前) $post = $post_green; // 現在を緑に戻す } /*$post_thumbnail_id = get_post_thumbnail_id($post);//画像の投稿データから画像IDを取得する ※おそらくいらない */ $red_post_thumbnail_id = get_post_thumbnail_id($post_red);//赤、青、緑の投稿データから前後の画像IDを取得する $blue_post_thumbnail_id = get_post_thumbnail_id($post_blue); $green_post_thumbnail_id = get_post_thumbnail_id($post_green); $red_post_image_src = wp_get_attachment_image_src($red_post_thumbnail_id);//赤、青、緑の投稿データから前後の画像URLを取得する $blue_post_image_src = wp_get_attachment_image_src($blue_post_thumbnail_id); $green_post_image_src = wp_get_attachment_image_src($green_post_thumbnail_id); /*$post_id = post_id ($post_red,$post_blue,$post_green);*/ ※$argsで設定済みなので多分必要ない // コメントオブジェクトの取得 $args = [ 'author__not_in' => '1', // 管理者を除く 'status' => 'approve', // 承認済み 'type' => 'comment', // コメント ]; $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); // 緑のコメント // コメントの表示 if (empty($comments_red)) { echo '<p>コメントなし</p>'; } else { echo '<ul>'; foreach ($comments_red as $comment) { echo "<li>{$comment->comment_content}</li>"; } echo '</ul>'; } if (empty($comments_blue)) { echo '<p>コメントなし</p>'; } else { echo '<ul>'; foreach ($comments_blue as $comment) { echo "<li>{$comment->comment_content}</li>"; } echo '</ul>'; } if (empty($comments_green)) { echo '<p>コメントなし</p>'; } else { echo '<ul>'; foreach ($comments_green as $comment) { echo "<li>{$comment->comment_content}</li>"; } echo '</ul>'; }

    • ベストアンサー
    • PHP
  • phpとmysqlでサイトのコンテンツを制作しているのですが...

    phpとmysqlでサイトのコンテンツを制作しているのですが、どうにも解決できないのでどなたかアドバイスをいただけないでしょうか? mysqlで $result = @mysql_query( 'drop tabl main_categories;' ); $sqlstr = "create table main_categories (id INTEGER primary key AUTO_INCREMENT,"."category TEXT)"; $result = mysql_query( $sqlstr ); としてテーブルを作ってこれをphpでデータを取得し格納したいのですがうまくいきません。取得データを $arr=mysql_fetch_array($result); で格納してforeachで出力?したいのですが。。。 foreach( $arr as $key => $value ) { if($value['category'] != ''){ array_push($categories_arr,$value['category']); array_push($catid_arr,$value['id']); } } どなたか教えてください!もう8hはまってます=3

    • 締切済み
    • PHP
  • あるカテゴリーの固定ページ一覧/WordPress

    <?php wp_list_pages('title_li='); ?>で固定ページ一覧が表示されますが あるカテゴリーの固定ページに限定して一覧表示できないでしょうか。 固定ページにカテゴリーを設定は、functions.phpに add_action('init','add_categories_for_pages'); function add_categories_for_pages(){ register_taxonomy_for_object_type('category', 'page'); } add_action( 'pre_get_posts', 'nobita_merge_page_categories_at_category_archive' ); function nobita_merge_page_categories_at_category_archive( $query ) { if ( $query->is_category== true && $query->is_main_query() ) { $query->set('post_type', array( 'post', 'page', 'nav_menu_item')); } } と記述して、解決しています。

    • ベストアンサー
    • PHP
  • PHPを使ってMySQLのフィールドの追加ができない

    function部分は外部ファイル function getResult($query){ $result[result]=mysql_query($query,$this->connect) or die(mysql_error()); $result[count]=@mysql_num_rows($result[result]); return $result; } $null = ""; $query="insert into main values ($_POST[id],'$_POST[name]',$null,$null,$null,'$null')"; $insert[result]=$db->getResult($query); このように記述してmainテーブル内に新規フィールドの追加をしようとしたのですが、次のようなエラーが出ます。 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ',,'')' at line 1 $nullは結局NULL値なので、 ($_POST[id],'$_POST[name]',,,,) でやってみたのですが、これも同じです。 当たり前といえば当たり前ですが、 ($_POST[id],'$_POST[name]',,,,)を ($_POST[id],'$_POST[name]')と 省略してみましたが、数が合わないとエラーが返ってきました。 定型のfunctionに頼らず、$insert[result]=$db->getResult($query);のかわりに if(mysql_query($query,$db->connect)){ echo"成功"; }else{ echo"失敗"; } このようにも試してみたのですが、データは追加されず、失敗と表示されてしまいます。 どこをどう修正すればいいでしょうか。 どなたかお助けください。 ちなみに1,3~5番目が数値型で、2,6番目が文字型、1番目以外はNULLを許可しています。 どこもオートインクリメントは使用していません。

    • ベストアンサー
    • PHP
  • functionsでどこまで括るのが正解なのか

    RSSを取得→格納→表示→定期的にキャッシュをphpで行っております。 index.phpにすべて記載したところfunctions.phpを利用したほうが良い、require_onceでpage.phpなどからindex.phpに読み込むようご指摘をいただいたので、コードを考えてみたのですがどの範囲までfunctionで括るのが正解なのかわかりません。 意見がわかれておりまして、役割によって分けるべきという方と、page.phpのみfunctions.phpを使いそのほかはrequire_onceで読み込めばいいという方と、すべてrequire_onceで読み込めばいいという方の3パターンありました。 どの方法が1番適切でしょうか?コードは以下になります。 <?php //別ファイルにして読み込む場合 function db($hlxclitx_wp1){//DB名を引数として受け取る $dbname //DB接続 try { $pdo = new PDO(“mysql:dbname=”$hlxclitx_wp1”_name;host=”localhost”;charset=utf8″,”hlxclitx_wp1”,”E.HrypHWxNmltXgC5eS26”)); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); return $pdo; }catch (PDOException $e) { echo $e->getMessage(); return $db = null; } } // カテゴリーIDをキーにしたカテゴリー配列を生成 function get_category_name_by_id($categories) { foreach (get_categories() as $category) { $categories[$category->cat_ID] = $category; } // 投稿の情報を追加 function set_other_data($post) { // アイキャッチIDを取得 $post_thumbnail_id = get_post_thumbnail_id($post); // アイキャッチ画像の確認 if ($post_thumbnail_id) { // 存在する $image_src = wp_get_attachment_image_src($post_thumbnail_id); // サムネイルの画像URLを設定 $post->thumbnail = $image_src[0]; } else { // 存在しない $post->thumbnail = 'noimage.jpg'; } // カテゴリーIDを取得 $post->categories = wp_get_post_categories($post->ID); // コメントテキスト if (0 == $post->comment_count) { // コメントなし $post->comments = __('No Comments'); } else { // コメントあり $post->comments = $post->comment_count.'件のコメント'; } // コメントリンク $post->comments_link = get_comments_link($post->ID); } //古いデータを削除 //※先に実行する //ものがないものはfunctons.phpに書いても使えないので、require_onceでまとめて読み込む認識 function delete_date_pdo($delete_date) { $sql = 'DELETE FROM rss_feed WHERE date < ?'; $stmt = $dbh->prepare($sql); $delete_date = date('Y-m-d H:i:s', strtotime('-1 week')); //※削除対象日付 $stmt->execute([$delete_date]); } //RSS保存 function save_url_rss($stmt){//本来は値がほしいところでfunction{}するのだろう長さの加減がわからず $url1 = [ 'http://nns2ch.net/index.rdf', 'http://aqua2ch.net/index.rdf', 'https://worldfn.net/index.rdf', ]; $stmt = $dbh->prepare('insert into rss_feed (title, link, date, img) values (?, ?, ?, ?) on duplicate key update title=?, link=?, date=?, img=?'); foreach ($url1 as $url) { if (($rss = @simplexml_load_file($url)) === false) { continue; } foreach ($rss->item as $item) { $dc = $item->children('dc', true); $date = date('Y-m-d H:i:s', strtotime($dc->date)); //※削除対象日付より古いRSSは保存しない if ($date < $delete_date) { continue; } $title = $item->title; $link = $item->link; $content = $item->children('content', true); $result = preg_match('/<img[^>]*src=\"([^"]+)\"[^>]*>/i', $content->encoded, $matches); if (1 == $result) { $img = $matches[1]; } else { $img = ''; } $stmt->execute([$title, $link, $date, $img, $title, $link, $date, $img]); } } } function one_page_count($post_items){ //表示設定 $current_page = $_REQUEST['page'] ?? 1; //現在ページ $block_per_page = 2; //ページあたりブロック件数 $rss_per_block = 18; //ブロックあたりRSS件数 $posts_per_block = 5; //ブロックあたり投稿件数 //RSS読み込み $rss_per_page = $block_per_page * $rss_per_block; //ページあたりRSS件数 $rss_offset = ($current_page - 1) * $rss_per_page; //RSSオフセット $sql = 'SELECT * FROM rss_feed ORDER BY date DESC LIMIT ?,?'; $stmt = $dbh->prepare($sql); $stmt->bindParam(1, $rss_offset, PDO::PARAM_INT); $stmt->bindParam(2, $rss_per_page, PDO::PARAM_INT); $stmt->execute(); $rss_items = $stmt->fetchAll(PDO::FETCH_OBJ); //投稿読み込み $posts_per_page = $block_per_page * $posts_per_block; //ページあたり投稿件数 $posts_offset = ($current_page - 1) * $posts_per_page; //投稿オフセット $args = [ 'posts_per_page' => $posts_per_page, 'offset' => $posts_offset, ]; $post_items = get_posts($args); } ?>

    • ベストアンサー
    • PHP
  • [wordpress] 固定ページで、カテゴリ名の

    [wordpress] 固定ページで、記事の一覧を表示し、その記事の属するカテゴリ名の表示 wordpressで、商品一覧ページを作成していて、一覧を表示するページは固定ページにしています。 その商品一覧の中で、記事(商品)の属するカテゴリ名を表示させたいのですが どうすればいいでしょうか? 商品が服なので、その商品が属するカテゴリを項目の一つとして出力したいのです。 つまり『抽出した商品毎(have_post()の出力結果)にカテゴリ名を抽出』という感じです。 具体的なソースも教えて頂けると助かります。 <?php the_category(); ?> はダメでした。 [参考ソース] <div id="collectionWrap" class="clearfix"> <?php $loop = new WP_Query( array( 'post_type' => 'collection', 'posts_per_page' => 8 ) ); while ( $loop->have_posts() ) : $loop->the_post(); ?> <div class="collection"> <div class="image"> <a href="<?php the_permalink() ?>"><?php echo wp_get_attachment_image(get_post_meta($post->ID,"画像",true),'medium' ); ?></a> </div> <div class="txt"> <div class="clearfix mb10"> <p class="upDate"><?php echo get_post_meta($post->ID,"性別",true); ?></p> <p class="seasons"> <span> /*ここにカテゴリの種類を出力 */ </span></p> </div> <p class="itemName"><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></p> <p class="itemPrice">&yen;&nbsp;<?php echo get_post_meta($post->ID,"価格",true); ?></p> </div> </div> <?php endwhile; ?> <?php wp_reset_query(); ?> </div> どうかよろしく御願いします。足りない情報等あればおっしゃってください。 自分でもいろいろ調べてるのですが、わかりません。。急いでます。

    • ベストアンサー
    • PHP
  • php selectbox hidden

    formでselectboxを作っています。 入力画面→確認画面→DB登録という流れになっており、 selectboxもDB内からひっぱりforeachで回しています。 入力画面 <select name="cat" id="cat" class="postform"> <option value="0">-- 選択してください --</option> <?php foreach ($categories as $category) { echo '<option value="' .$category->term_id. '">' .$category->cat_name. '</option>'."\n"; } </select> のようにしています。 DBの接続は省かせていただきます。 確認画面 echo $_POST['cat']; としていますが、このままだとvalueの値のみ($category->cat_nameのid)が表示されます。 確認画面では$category->cat_nameと表示され登録時には$category->term_idとしたいです。 どなたかおわかりの方がいらっしゃいましたらよろしくお願いします。

    • 締切済み
    • PHP

専門家に質問してみよう