- ベストアンサー
WordPressの質問(q10044117)の続
- WordPressの質問(q10044117)について続報です。
- タイトルから表示されていない状態でのページナビの修正について質問しています。
- 現在のコードや確認に使用したコードなども共有しています。
- みんなの回答 (65)
- 専門家の回答
質問者が選んだベストアンサー
・ASは=のようなものだと思うのですが、meta_valueとaccess_countをなぜつなげる必要があるのでしょうか? ASは「=」や「つなげる」ようなものではありません。 テーブルや列に別名をつけるものです。 phpMyAdminで試してみるとわかると思います。 例えば、以下のSQLを実行すると、 ---- SELECT post_title FROM wp_posts ---- 一覧にはテーブルの列名「post_title」がそのまま表示されます。 次に以下のようなas句を追加してみてください。 ---- SELECT post_title AS タイトル FROM wp_posts ---- すると、一覧の見出しは「タイトル」になります。 このように元の名前とは別の名前を付けて参照するためのものです。 今はカテゴリーランキングのアクセスカウントを表示しなくなっているので、別名access_countを付けた意味がなくなってしまいました。 表示していた時はおそらく「$term->access_count」のようにして使っていたかと思います。 別名をつけなかった場合は「$term->meta_value」と書けば済む話しです。 ですが、meta_valueではなんの値かわかりにくいため、access_countとしておけば、アクセスカウントであることがわかりやすくなります。 ・wp_terms AS t についてもお聞きしたいのですが、tと命名した列にwp_terms ASテーブルを設置するという認識で間違いないでしょうか? これも同じことで、元の名前とは別の名前を付けて参照するため、です。 設置と言われると何か新しくそこに用意したような感じがしますが、 別の名前にしているだけで、元のものとかわりありません。 テーブルに別名をつけるのは、列とは少し違う意味です。 今は以下のように書いていますが、 ---- FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id ---- 別名をつけなかった場合は以下のように、 ON句にテーブル名を書きます。 ---- FROM wp_terms INNER JOIN wp_term_taxonomy ON wp_terms.term_id = wp_term_taxonomy.term_id ---- ここだけ見ると1回ずつ書くだけなのでどうと言うこともありませんが、 他にもtやttのところがあるので、それを全部テーブル名で書くと、 やたら長くなって見にくくりますし、 タイプミスをする頻度が上がるかも知れません。 tやttにするのは省略して短く書くためと言うのがひとつです。 他にもASを使う理由と言うか絶対に必要な場合もあります。 今のところそのようなSQLを書くことがないので説明は割愛します。
その他の回答 (64)
- dell_OK
- ベストアンサー率13% (766/5720)
gitの導入は私の都合なので後回しで。 質問者さまのされたいことを進めてくださいね。 コメントにいいねボタンを付けるのは、 プラグインがあるみたいですので、 試してみてはいかがでしょうか。
お礼
申し訳ありません。下記のカテゴリーランキングを参考にしたいのですが、理解できていないところがあり質問があります。 cc.meta_value AS access_countで、 ASは=のようなものだと思うのですが、meta_valueとaccess_countをなぜつなげる必要があるのでしょうか? SELECTは自身で命名した列になると思いますので、列名でイコールを使う理由が分かりません。 FROM wp_terms AS t についてもお聞きしたいのですが、tと命名した列にwp_terms ASテーブルを設置するという認識で間違いないでしょうか? ※該当コード SELECT t.*, tt.*, cc.meta_value AS access_count FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id INNER JOIN ( SELECT * FROM wp_termmeta WHERE meta_key = 'category_count_week' AND meta_value != 0 ) AS cc ON t.term_id = cc.term_id ORDER BY cc.meta_value DESC LIMIT 20 ";
補足
回答ありがとうございます。先にいいねボタンの作成に取り掛かります。 いいねボタンをプラグインで探してみたのですが、コメント1つ1つにハートマークを設置できるものがないため、自作で考えてみます。
- dell_OK
- ベストアンサー率13% (766/5720)
パソコンへのインストールは以上です。 githubのリポジトリは私が用意しましょうか。 それとも質問者さまが用意されますか。 と言っても、 私が用意するつもりでやっていたのですが、 ちょっとてこずっています。 やり方がはっきりしたら、改めて説明します。 リポジトリは誰のものだとしても、 プッシュにはgithubのアカウントが必要そうなので、 お持ちでなければ作成しておいてください。 もしかしたらですが、 先日設定していただいた名前とメールアドレスは、 githubのアカウント登録と同じでないといけないかも知れません。
補足
回答ありがとうございます。 リポジトリは導入の仕方がわからないためおまかせします。 了解いたしました。よろしくお願い致します。 githubのアカウントを作成しました。 メールアドレスはおなじものを作成しているのですがアカウント名は異なるため変更が必要な場合は、後ほど再インストールいたします。
- dell_OK
- ベストアンサー率13% (766/5720)
gitのコマンドツールがインストールできてよかったです。 では次に、GUIツール「TortoiseGit」をインストールします。 こちらのページからダウンロードします。 ビットの合ったものをダウンロードしてください。 https://tortoisegit.org/download/ あと、日本語パックもインストールするので、 ちょっと下にある「Japanese」のところから、 これもビットに合ったものをダウンロードしてください。 今だとこのバージョンのファイルだと思います。 TortoiseGit-2.13.0.1-xxbit.msi(本体) TortoiseGit-LanguagePack-2.13.0.0-xxbit-ja.msi(日本語パック) まずは本体からインストールします。 すべて[Next]で進んでインストールしていただくのですが、 最後の完了画面の[Finish]はまだクリックしないでください。 次に日本語パックをインストールします。 [次へ]で進んで、 「Configure TortoiseGit to use this language」にチェックをつけて、 [完了]をクリックします。 完了画面に戻って、 「Run first start wizard」にチェックがついている状態で [Finish]をクリックします。 初期設定ウィザード画面が表示されます。 「言語」が「日本語」になっているのを確認して、 [次へ]で進んでください。 名前とメールアドレスは適当なものを入力してください。 質問者さまか私のどちらがコミットしたかの判別にしか使いませんので、 OKWAVEのアカウント名と同じでもいいです。 メールアドレスはmail@mail.comとかでも大丈夫です。 [次へ]で進んで、あとは[完了]ですね。 デスクトップの何もないところで右クリックすると、 以下のメニューが増えていると思います。 ~~~~ Git クローン(複製) Git ここにリポジトリを作成 TortoiseGit ~~~~ インストールはここまでです。
補足
A.導入説明ありがとうございます。日本語でインストールすることができました。 追加メニューも確認とれましたので、成功しているようです。 次のセットアップについてアドバイスお願い致します。 ~~~~ Git クローン(複製) Git ここにリポジトリを作成 TortoiseGit ~~~~
- dell_OK
- ベストアンサー率13% (766/5720)
・範囲指定できるページはSQLで実行するということでしょうか。 そうですね、そうなります。 ただ、get_posts()がパラメータで対応しているような、 簡単な条件であれば、こちらを使ってもいいです。 ・1つのSQLで取得する場合はdisplay.phpで読み込む形になるのでしょうか… ひとつのSQLと言ったのは、 検索ページで、SQLと関数のふたつを使っているからです。 ページごとにテーブルの組み合わせや条件が違うはずなので、 他のページと共通で使えるひとつのSQLはありません。 なのでまとめる意味で「display.phpで読み込む」と 言われているのでしたら、そうはしない方がいいです。
補足
A.回答ありがとうございます。なるほどSQLはだからdisplay.phpにまとめなかったんですね。
- dell_OK
- ベストアンサー率13% (766/5720)
・インストールに失敗してしまったため教えていただけると助かります。 インストールに失敗となると、難しいかも知れないですね。 とりあえず、gitのコマンドツールをインストールしてみましょうか。 GUIで操作できるツールはそのあとになります。 GUIで操作できると言っても、内部でgitのコマンドを実行するだけのものです。 なのでgitのコマンドツールは必須です。 まずは、こちらのページからダウンロードします。 https://git-scm.com/download/win お使いのWindowsOSが32ビットか64ビットかわかりますか。 スタートメニュー右クリック - システム - 詳細情報 で、 ~~~~ システムの種類 xxビットオペレーティングシステム ~~~~ のxxのところに書かれています。 ダウンロードページから同じビットのものをダウンロードしてください。 ~~~~ Standalone Installer 32-bit Git for Windows Setup. 64-bit Git for Windows Setup. ~~~~ ダウンロードしたファイルを実行します。 インストールはほとんど[Next]ボタンで進んでいきます。 以下の画面だけ変更してください。 「Select Components」は全部チェックをはずすします。 「Configuring the line ending conversions」は「Checkout as-is, commit as-is」を選択します。 これで無事にインストールができるといいのですが。
補足
インストールすることができました。ありがとうございます。 下記のように表示されております。 user@inoue-PC MINGW32 ~ $ ※表示画面 https://imgur.com/BhSHFpP.jpg
- dell_OK
- ベストアンサー率13% (766/5720)
・category.phpは前後の記事に対するコードがないというのが、範囲指定が有効か否かの判断基準でしょうか? ちょっと解釈が難しいですね。 間違ってはいませんが、 単純に、範囲指定したいだけ、と思っていいです。 検索ページは前後があるので範囲指定できませんでしたが、 他のページは範囲指定が基本です。 ひとつのget_posts()、または、ひとつのSQLで、 表示に必要かつ最小限の記事が取得できるからです。 検索ページと同じように、全件取得しておいて、 表示したい部分だけを表示する方法もあります。 なぜ範囲指定するのかと言うと、 データベースとのやりとりを最小限にするためです。 通常、データベースは要求したSQLを実行して、 結果が集まってから、応答してきます。 全件取得するよりも、範囲指定した方が、 結果が集まる時間が短くなりますし、 流れるデータ量も少なくなります。 全件取得している方が、 よりサーバーに負荷がかかることになります。 検索ページでは前後の取得に関数を使っていて、 それも1件ずつしか取得できないため、 検索文字に該当する記事が多ければ多いほど負荷がかかります。 レンタルサーバーの性能のおかげか、 総件数が多くないから、負荷を感じることはないかも知れませんが、 同時に何十人もアクセスしてきたらどうなるかわかりません。 最初の頃に試みていたのですが、 前後の記事IDをカスタムフィールドで関連付ければ、 ひとつのSQLで前後の記事ごと取得することもできます。 ただ、WordPress標準の記事編集画面ではメンテナンスが大変なため、 専用の画面を作った方が便利になります。 今のままでも、長くてややこしいSQLにはなりますが、 ひとつのSQLで取得することができるはずです。 効率のよいSQLを記述すれば、 1件ずつ取得する関数を実行するよりもはるかに速いはずです。 ひとつのSQLで記述できれば範囲指定ができるようになります。 それでもあまりややこしいSQLだと、 データベースでの実行に時間がかかるようになるかも知れないので、 こればかりは試してみないとわかりません。 ただ、そのような苦労をしても、 ページナビのための全件数取得があるため、 あまり報われないかも知れません。 もっと簡単なページナビで、 例えば「次へ」しかなければ、 ページナビのためのSQLの実行は不要になるのですが。 と、長々説明しましたが、ひとまず動いているので、 負荷だのなんだのは考えないでおきましょう。
補足
A.解説ありがとうございます。なるほど、ということは範囲指定できるページはSQLで実行するということでしょうか。 確かに全件取得するよりも負荷は軽減されますね。 カスタムフィール名も増えてメンテナンスも大変になるのは何となく分かります。 1つのSQLで取得する場合はdisplay.phpで読み込む形になるのでしょうか… 想像してみると速度も早くなるように思えます。 今はそのままの状態で進めていきます。
- dell_OK
- ベストアンサー率13% (766/5720)
・category.phpもIDで並べていた為、変更致しました。 範囲指定がなくなっています。 LIMIT %d,%d と、 $query = $wpdb->prepare($sql, $cat, $tk, $posts_offset, $posts_per_page); は戻しておいてください。 検索ページでは範囲指定が無意味でしたが、 カテゴリーページは範囲指定が有効です。 ・ボタンを実装する場合SQLのテーブルを応用できると想定されますでしょうか? コメント欄に付随する場合、テーブルはwp_commentsを使用できると考えております。 wp_posts(記事)には付随するwp_postmetaテーブルがあります。 記事のカスタムフィールドを記録しています。 wp_terms(カテゴリー)にはwp_termmetaテーブルがあります。 カテゴリーのアクセスカウントはここに記録しています。 wp_comments(コメント)にも同じようにwp_commentmetaテーブルがありますので、 いいねボタンがクリックされたカウントはこのwp_commentmetaになってくると思います。 ・いいねボタン→お問い合わせページ→記事の削除→掲示板→アンケートフォーム 壮大な計画があるようですね。 私がどこまでおつきあいできるかわかりませんが、 そろそろ終わりかなと思って辛抱していたことがあります。 コードのやりとりについてですが、 Wandboxでは手間がかかるため、 githubを介してコードのやりとりができるととても助かります。 私の都合で申し訳ないのですが、 gitの導入を検討していただけますでしょうか。 説明サイトを探してみたのですが、 なかなかこれだというのが見つからなかったので、 私流のやり方で説明することになろうかと思います。 コマンドを入力しなくてもいいようなツールがありますので、 簡単に扱えるようになると思います。 githubは私のところを使っていただいてもいいですし、 質問者さまが用意してくださってもかまいません。 とは言え、質問者さまのサイトのコードなので、 それが公開状態にあると言うのも問題かも知れないですし、 いくつかパソコンにインストールするものもあり、 無理なお願いはできませんので、 断ってくださってもかまいません。
補足
A.回答ありがとうございます。category.phpは前後の記事に対するコードがないというのが、範囲指定が有効か否かの判断基準でしょうか? wp_commentmetaでカウントできると聞いて安心しました。ありがとうございます。 githubは以前から導入していきたいと考えていた為、調べてみます。 長期間教えていただきありがとうございます。負担をおかけしてしまい申し訳ないです。 無理のない範囲で回答いただけると助かります… 以前コマンドプロンプトから導入を考えていたのですが、インストールに失敗してしまったため教えていただけると助かります。 よろしくお願い致します。
- dell_OK
- ベストアンサー率13% (766/5720)
・LIMIT %d,%d,$posts_offset, $posts_per_pageがそれぞれなくなっていることについて理由が知りたいです。 全件取得するためになくしました。 なくしたと言うよりも、 ページナビ用のものです、と言った方が正しいです。 回答No.53にそのことを書いてます。 前者と後者で後者だけでよかった話しです。
補足
回答ありがとうございます。ページナビのSQLを削除したことで必要ではなくなったということですね。 前者の件数指定には意味がないことがわかったので、全件取得に切り替えたことを思い出しました。 category.phpもIDで並べていた為、変更致しました。 確認よろしくお願い致します。 ※修正後のコード(search.phpとcategory.php) https://wandbox.org/permlink/6OL3aWylL5t5y90M それぞれのページを作り終えましたので、今後作成していきたい機能があるのですが… 以前お問い合わせページと記事の削除について実装する計画を立てていました。 この2つの機能と別に挑戦してみたい機能がありまして、 最終的にいいねボタン→お問い合わせページ→記事の削除→掲示板→アンケートフォームという順番を考えています。 アンケートフォームにつきましては、お問い合わせフォームと似たような形で題名と内容を送信できるような形を考えております。 1,それぞれのコメントにいいねボタンのを設置 2,画像添付の掲示板 3,アンケートフォームの実装 コメント欄を作成するときに伝えておけばよかったのですが、1つ1つにボタンを付けるべきか迷っていた為後回しにしておりました。 申し訳ありません。 初歩的な質問になるのですが、ボタンを実装する場合SQLのテーブルを応用できると想定されますでしょうか? コメント欄に付随する場合、テーブルはwp_commentsを使用できると考えております。 もしSQLを使うことができない場合は自作テーブルを作成してカウントアップを実装する予定です。
- dell_OK
- ベストアンサー率13% (766/5720)
・$post_itemsを$stack_itemsに変更してみたのですが、間違えている個所はありますでしょうか? いいと思います。 あとは、重複コードの部分を削除して、表示処理を移動してください。 以下のようになると思います。 ---- //ページリンク $search_query = filter_input(INPUT_GET, 's'); var_dump($search_query); $sql = " SELECT distinct post.* FROM wp_posts AS post INNER JOIN wp_postmeta AS meta ON post.ID = meta.post_id WHERE meta.meta_key = %s AND post.post_type = 'post' AND post.post_status = 'publish' AND (post.post_title LIKE %s) ORDER BY post.post_date DESC "; $query = $wpdb->prepare($sql, $tk, "%$search_query%"); $search_items = $wpdb->get_results($query); if (1 == $tn) { $stack_items = $search_items; } elseif (2 == $tn) { $post_ids = []; $stack_items = []; foreach ($search_items as $post) { if (in_array($post->ID, $post_ids)) { continue; } $team = get_post_meta($post->ID, 'team', true); if ('white' === $team) { $post_white = $post; /* 白(現在) */ $post_black = get_adjacent_post(true, '', true); /* 黒(現在の前) */ } elseif ('black' === $team) { $post_black = $post; /* 黒(現在) */ $post_white = get_adjacent_post(true, '', false); /* 白(現在の後) */ } $post_ids[] = $post_white->ID; $post_ids[] = $post_black->ID; $stack_items[] = $post_white; $stack_items[] = $post_black; } } elseif (3 == $tn) { $post_ids = []; $stack_items = []; foreach ($search_items as $post) { if (in_array($post->ID, $post_ids)) { continue; } $team = get_post_meta($post->ID, 'team', true); if ('red' === $team) { $post_red = $post; /* 赤(現在) */ $post_blue = get_adjacent_post(true, '', true); /* 青(現在の次) */ $post = $post_blue; /* 現在を青に置きかえる */ $post_green = get_adjacent_post(true, '', true); /* 緑(現在の次:青の次) */ } elseif ('blue' === $team) { $post_blue = $post; /* 青(現在) */ $post_red = get_adjacent_post(true, '', false); /* 赤(現在の前) */ $post_green = get_adjacent_post(true, '', true); /* 緑(現在の次) */ } elseif ('green' === $team) { $post_green = $post; /* 緑(現在) */ $post_blue = get_adjacent_post(true, '', false); /* 青(現在の前) */ $post = $post_blue; /* 現在を青に置きかえる */ $post_red = get_adjacent_post(true, '', false); /* 赤(現在の前:青の前) */ } $post_ids[] = $post_red->ID; $post_ids[] = $post_blue->ID; $post_ids[] = $post_green->ID; $stack_items[] = $post_red; $stack_items[] = $post_blue; $stack_items[] = $post_green; } } // 表示 $post_items = array_slice($stack_items, $posts_offset, $posts_per_page); if (1 == $tn) { display_rss_post_1(); } else { display_rss_post_2(); } $post_count = count($stack_items); display_pagenavi(); ---- 141行目では配列ができているので、 エラーにはならなさそうですが、不思議ですね。 上記コードのようにしてもエラーになるか確認してみてください。 私もget_adjacent_post()について調べてみましたが、 やはり投稿日時で前後を見ているようでした。 なので、SQLも以下のように投稿日時に変更しています。 ---- post.post_date DESC ---- IDを並び順で使わないようにしましょう。 他のPHPファイルもIDにしたものは、 投稿日時に戻しておいてください。 もし投稿日時が乱れている記事のセットがあったら、 画像2のセットの前後は、同日同時にして、 分を、前は01分、後は02分に、 画像3のセットの前中後は、同日同時にして、 分を、前は01分、中は02分、後は03分にしてください。 前後関係が保たれるのであれば、01~03でなくてもかまいません。 私としては秒の方がいいと思うのですが、 WordPressの記事編集画面には秒がないため分で調整してください。
補足
私もget_adjacent_post()について調べてみましたが、 やはり投稿日時で前後を見ているようでした。 なので、SQLも以下のように投稿日時に変更しています。 ---- post.post_date DESC ---- A.解説ありがとうございます。 $post_itemは削除して$stack_itemsに変更するということですね。 コードを試してみたところエラーを解消することができました。 他のファイルも同様に変更する予定ですが、LIMIT %d,%d,$posts_offset, $posts_per_pageがそれぞれなくなっていることについて理由が知りたいです。 post.ID DESCからpost.post_date DESCに変更したときに並べ方以外に何か変化したのでしょうか?
- dell_OK
- ベストアンサー率13% (766/5720)
・検索用のSQLとページナビ用のSQLを1つにまとめるという認識であってますでしょうか? そうですね。 まとめると言うか、ページナビ用のSQLだけでいいと言うか。 ・display_rss_post_1();の前に追加しないのは、画像1タイトル1は何件目から何件を表示する必要がないからでしょうか? 必要でした。 display_rss_post_1()の前より、 if (1 == $tn) {の前にして、 display_rss_post_2()の前はなくしてください。 その方が記述が一回で済みます。
補足
A.回答ありがとうございます。$post_itemsを$stack_itemsに変更してみたのですが、間違えている個所はありますでしょうか? 通常ページナビ用を変更すべきだと思うのですが、表示コードにarry_sliceを追加しているためどちらを変更すべきか分からない状態です。 両方$post_itemsですと$stack_items(配列)が空というエラーが発生致します。 ※エラー文 Warning: array_slice() expects parameter 1 to be array, null given in /home/zblgibzx/public_html/wp-content/themes/sample_theme/search.php on line 141 取得($stack_items?)→表示(arry_slice)→ページナビ($post_items?) // 表示 $post_items = array_slice($stack_items, $posts_offset, $posts_per_page); if (1 == $tn) { display_rss_post_1(); } else { display_rss_post_2(); } ※現在のコード https://wandbox.org/permlink/iPOG9uBrMpBh5m19
お礼
質問の期限が心配でしたので、新たに質問を立てさせていただきました。よろしくお願いいたします。 https://okwave.jp/qa/q10063418.html ※実装予定のボタンイメージ https://imgur.com/cLfHf4Z.jpg ※参考サイト http://animesoku.com/archives/31869926.html
補足
Q.テーブルに別名をつけるのは、列とは少し違う意味です。 他にもtやttのところがあるので、それを全部テーブル名で書くと、 やたら長くなって見にくくりますし、 タイプミスをする頻度が上がるかも知れません。 A.アドバイスありがとうございます。別名ではないかとも考えたのですが、列に別名を付けるメリットがわかりませんでした。 関数から値を取得したい場合わかりずらいから別名を名付けたということですね。 なるほど確かに1つだと問題ないように見えますが、複数テーブルにもなると見にくいですね。 短縮してミスを減らすためですね勉強になりました、ありがとうございます。覚えておきます。