- ベストアンサー
functionsでどこまで括るのが正解なのか
- functions.phpを利用したほうが良い、require_onceでpage.phpなどからindex.phpに読み込むようご指摘をいただいたので、コードを考えてみたのですがどの範囲までfunctionで括るのが正解なのかわかりません。
- 意見がわかれておりまして、役割によって分けるべきという方と、page.phpのみfunctions.phpを使いそのほかはrequire_onceで読み込めばいいという方と、すべてrequire_onceで読み込めばいいという方の3パターンありました。
- どの方法が1番適切でしょうか?
- みんなの回答 (10)
- 専門家の回答
質問者が選んだベストアンサー
>ドキュメントルート内のconfig-phpのものを扱うほうが隠ぺいが必要に見えるのですが、安全なのでしょうか? A.質問者さんが、サービスを譲渡する、という大きな事以外にも、「テーマ」再配布する、ということもあると思います。 その場合、WP本体ごと全部渡すのではなく、作成した部分だけ、つまり「テーマ」だけ再配布することとなると思います。 その場合、wp-config.phpは渡さないことになりますので、「テーマ」の中で乱雑にハードコードするよりは安全と思います。 >現在のページはページ番号をクリックしたときに自動でコンテンツが切り替わるものなのでユーザーが操作できるものなのか? A.$_REQUESTというスーパーグローバル変数は、$_GETと$_POSTの内容を合算したものが入っています。 ですので、URLに「?page=hogehogehoge」と入力した状態で画面遷移すると、それが入力されます。 >ユーザーが入力するフォームがないので値をバリデーションで確認するような場所は存在するのか? A.質問者さんの作成されたコンテンツの全量をみているわけではないので「一般的にそういった外部からの入力のインターフェースを備えた入り口があるのであれば」チェックする必要がある、という意味です。 フォームなどの窓口がなく、スクリプトの例の「$_REQUEST['page']」以外にスーパーグローバル変数を利用されていないのであれば大丈夫だと思います。
その他の回答 (9)
- hogehoge78
- ベストアンサー率80% (433/539)
>1度コードは完成したのですが、wordpress本来の使い方ではないと指摘があり不安です。$wpdbを使わずに取得してもテーマがいきなり壊れるという可能性はありますでしょうか? A.今回の質問者さんの記述については問題ないと思います。別にテーマも壊れません。その理由が以下です。 (以下Wordpressと書くと長いのでWPと省略) 【1】RSS送受信において自身で作成したテーブルを使っている WPが標準で用意したテーブルに追記しているわけではなく、自分で作成したテーブルへの読み書きを行っているにすぎないので 特にWPに干渉していないため、WPの大型アップデートなどで影響を受けづらいものと思います。 $wpdbを利用した方が統一感はありますが、今急いで合わせに行くほど緊急性が高いとは思いません。 ※ ただ、いくつか前の回答でサンプルを記載したように、ユーザID・PW等はwp-config.phpの定数を利用した方が良いとは思います。 ※ 何らかの理由でテーマそのものを譲渡する、公開するなどした場合に、接続先情報を隠蔽するためにソースコードを書き換える必要が出てきてしまうのが純粋に面倒なため。 【2】ソースコードの作成はあくまでテーマフォルダの中で完結している テーマフォルダの中はWPのアップデートで干渉されることはないのである程度は好きに記述できるはずです。 いずれにせよ、PHPそのもののアップデートで使っていた記述方法が非推奨/廃止になったらどうせ利用できなくなるのでその時に改修を余儀なくされます。 また、WPアップデートでWPのタグの一部が廃止、使い方変更が起こった場合にも同様です。 それは今現状でベストプラクティスとされている書き方をしたとしてもいずれ発生する問題ですのであまり気にしすぎない方が良い出来事です。 【3】WP本来の使い方とは 「本来の使い方」の意味するところがどこにあるか。 それが、「WPの作法通りに書く」であれば、確かにPDOを使うなどは特殊かもしれません。また、探せばプラグインでRSS取得を行うものがすでにあるかもしれませんね。 でもそれは、チーム開発で共同で作業を行うのであれば共通認識というものが非常に重要ではありますが、個人的なプロジェクトでそこまで厳密に行う必要はないと思います。 そして私が思うWPの「本来の使い方」は「素早くコンテンツを作成すること」です。 PHP自体がもともとそういう思想の言語と認識しておりますし、プログラムを行ってやりたいことはあくまでアプリケーションを作ることです。 ある程度自衛が出来ていれば(セキュリティとか)、多少の設計上の不備やソースコードがスパゲッティになっていても良いと思います。 ※ 良いかどうかでいえばよくはないですけど、自分で作って自分で治すんだからいいでしょ。 念のため、セキュリティといった点についていくつかここら辺が大丈夫かだけ確認しておいてください。 (1) 不正な値が入力されないか →表示設定で「$current_page = $_REQUEST['page'] ?? 1; //現在ページ」とありますが、このリクエストに数値以外が入力されても問題ないか →それ以外に外部から入力された値($_REQUESTや$_POST、$_GETなどで取得できる値)は適切に不正な値が混入されないようにできているか (2) 他所に迷惑をかけていないか →他所からRSSを取得するタイミングは適切か。秒単位で大量に何度もアクセスしたりしないか (3) DBに接続できないとき正しくエラーはハンドリングできているか →PDOに接続できない場合に、処理を中断できるように出来ているか。画面上にエラーメッセージだだもれになったりしないか よろしくお願いいたします。
お礼
下記の質問があるのですが、1つずつ問題があるので解決していけるようアドバイスお願いします。 (1) 不正な値が入力されないか →表示設定で「$current_page = $_REQUEST['page'] ?? 1; //現在ページ」とありますが、このリクエストに数値以外が入力されても問題ないか →それ以外に外部から入力された値($_REQUESTや$_POST、$_GETなどで取得できる値)は適切に不正な値が混入されないようにできているか A.現在のページはページ番号をクリックしたときに自動でコンテンツが切り替わるものなのでユーザーが操作できるものなのか? ※ユーザーが変えられるとしたらURLくらい? →それ以外に外部から入力された値($_REQUESTや$_POST、$_GETなどで取得できる値)は適切に不正な値が混入されないようにできているか A.ユーザーが入力するフォームがないので値をバリデーションで確認するような場所は存在するのか?
補足
WPの大型アップデートなどで影響を受けづらいものと思います。 $wpdbを利用した方が統一感はありますが、今急いで合わせに行くほど緊急性が高いとは思いません。 ※ ただ、いくつか前の回答でサンプルを記載したように、ユーザID・PW等はwp-config.phpの定数を利用した方が良いとは思います。 A.ありがとうございます。勉強になります。 接続先情報を隠蔽するためにソースコードを書き換える必要が出てきてしまうのが純粋に面倒なため。 A.ドキュメントルート内のconfig-phpのものを扱うほうが隠ぺいが必要に見えるのですが、安全なのでしょうか? 念のため、セキュリティといった点についていくつかここら辺が大丈夫かだけ確認しておいてください。 (1) 不正な値が入力されないか →表示設定で「$current_page = $_REQUEST['page'] ?? 1; //現在ページ」とありますが、このリクエストに数値以外が入力されても問題ないか →それ以外に外部から入力された値($_REQUESTや$_POST、$_GETなどで取得できる値)は適切に不正な値が混入されないようにできているか (2) 他所に迷惑をかけていないか →他所からRSSを取得するタイミングは適切か。秒単位で大量に何度もアクセスしたりしないか (3) DBに接続できないとき正しくエラーはハンドリングできているか →PDOに接続できない場合に、処理を中断できるように出来ているか。画面上にエラーメッセージだだもれになったりしないか よろしくお願いいたします。 A.今から確認のほうを行って回答させていただきます。
- hogehoge78
- ベストアンサー率80% (433/539)
>自分の考えでは、機能と呼び出しをつなげてそれぞれ別のファイルに記入するというのが正解だと思うのですが。 >呼び出すコードが必要ないということでしょうか? A.一回実行したらその実行結果(今回の場合PDOのインスタンス)を使いまわしたい、ということであれば、 オブジェクトであればシングルトンというパターンを用いることがあります。 今回は、もう少し簡素な方法で実装をご提案いたします。 以下のように「静的変数」といったものを用いると、それが可能です。 <?php function db() { static $db = null; // ① if ($db === null) { // ① echo "ここは一回しか実行されない"; $db = 'ここでPDOインスタンスを代入する'; } return $db; // ③ } ?> ①関数内に「static」というキーワードを付けた変数を定義 ②その変数がNULLであった場合、質問者さんが書いたようなPDOインスタンスを作成する処理を行う ③PDOインスタンスが作成された静的な変数$dbを返す このようにします。②の処理は2回目以降は$dbにはPDOインスタンスが代入されておりますので、実行されない、という仕組みです。 これを用いていただければ、 <?php function delete_old_rss() { $dbh = db(); // このように利用できます。 $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]); }
お礼
break構文がよくわからないのですが、continueで括るのかfor{}で括るのかわかりかねます。 //表示 for ($i = 0; $i < $block_per_page; ++$i) {//投稿よりもページあたりブロック件数のほうが多い echo '<h2>ブロック</h2>'; echo '<h3>RSS</h3>'; for ($j = 0; $i <= 13; $j < $rss_per_block; ++$j) {//ページあたりのRSS数よりもブロックあたりRSS件数のほうが多い $item_index = $i * $rss_per_block + $j;//投稿のアイテム数=ページあたりの投稿数×ページあたりのブロック件数 if ($item_index >= count($rss_items)) {//もし投稿のアイテム数が大きいならRSSアイテムをカウントするのをやめる break; } $item = $rss_items[$item_index];//アイテム=RSSアイテム if ($j = 0; $j < 6; $i++) { echo '<ul>'; echo "<li class=\"sitelink\"><a href=\"{$item->link}\">{$item->title}</a></li>";//タイトルのみ } if ($j = 6; $j < 10; $i++) { echo "<li class=\"sitelink\"><a href=\"{$item->link}\">{$item->title}</a></li>";//タイトルのみ for ($j = 0; $i < 4; $j < $rss_per_block; ++$j) {//ページあたりのRSS数よりもブロックあたりRSS件数のほうが多い 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)) {//もし画像が空の場合 $img = 'wp-content/uploads/2021/12/EXt1cESWAAAwdOY.jpg'; } else { $img = $item->img;//画像を取得する } echo "<li><a href=\"{$item->link}\"><img src=\"{$img}\" width=\"100\"></a></li>"; echo '</ul>'; } } if ($j = 10; $j < 15; $i++) { echo "<li class=\"sitelink\"><a href=\"{$item->link}\">{$item->title}</a></li>";//タイトルのみ for ($j = 0; $i < 4; $j < $rss_per_block; ++$j) {//ページあたりのRSS数よりもブロックあたりRSS件数のほうが多い 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)) {//もし画像が空の場合 $img = 'wp-content/uploads/2021/12/EXt1cESWAAAwdOY.jpg'; } else { $img = $item->img;//画像を取得する } echo "<li><a href=\"{$item->link}\"><img src=\"{$img}\" width=\"100\"></a></li>"; echo '</ul>'; } }
補足
勉強になりました。ありがとうございます。 1度コードは完成したのですが、wordpress本来の使い方ではないと指摘があり不安です。$wpdbを使わずに取得してもテーマがいきなり壊れるという可能性はありますでしょうか?
- hogehoge78
- ベストアンサー率80% (433/539)
>functions.phpを読み込まないとfunctions.phpに書いた関数を使うことはできないので「functions.phpにdb接続を書いて、読み込ませず直に書く」という使い方ができるものではありません。 >ですので一つのファイルで完結させたい場合は、list.phpにデータベース接続の関数を書くか、関数を作らずにデータベース接続のコードを直接書く方法になるかと思います。 A.毎回で申し訳ないのですが、それは「wordpressのテーマフォルダにあるfunctions.php」に限定した「functions.php」の回答でしょうか。 もしそうであるならば、これ以上の回答は差し控えさせていただきます。 というのは、Wordpressの同格を行い、ソースコード確認の上、「間違いなくテーマフォルダの中のfunctions.phpはWordpressにより自動的にインクルードされている」と回答させて頂いております。 結果、私の利用している通常のWordpressとは別の使い方を利用されている、または別のバージョンのCMSをご利用されているように見えますので、これ以上の回答は混乱に至ると思われます。
補足
申し訳ありません。 wordpressのfunctions.phpに自動で読み込まれるようです。 勘違いしておりました。 RSSをデータベースに格納できない 上記の質問でdell_OKさんからも同様のアドバイスをいただいており、functions.phpに書くものと呼び出すもの両方のコードを提案いただきました。 functions.phpに下記の内容を追加しております。 自分の考えでは、機能と呼び出しをつなげてそれぞれ別のファイルに記入するというのが正解だと思うのですが。 呼び出すコードが必要ないということでしょうか? function db_connect() { try { $dsn = 'mysql:dbname=hlxclitx_wp1;host=localhost'; $user = 'hlxclitx_wp1'; $password = 'E.HrypHWxNmltXgC5eS26'; $dbh = new PDO($dsn, $user, $password); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //エラーが発生した時に、例外を投げる echo 'データベースへの接続が出来ました'; return $dbh; //※接続したオブジェクトを返す } catch (PDOException $e) { echo $e->getMessage(); // err時はメッセージを表示 exit; } } function delete_old_rss($dbh)//※接続オブジェクトを受け取る { $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]); } function insert_rss($dbh)//※接続オブジェクトを受け取る { $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=?'); } ※呼び出すコード $dbh = connect_db();//接続オブジェクトを保持する delete_old_rss($dbh);//接続オブジェクトを渡す insert_rss($dbh);//接続オブジェクトを渡す
- hogehoge78
- ベストアンサー率80% (433/539)
ご回答ありがとうございます。 特別特殊な作りをしていないように見受けられますので、以下回答いたします。 >同様のものです。格納しているのは記事とRSSで総数を決めて交互に出力するためですので。(DBがWordpressと同様のものである) A.DB接続先がwordpressのDBと同様のものである、というのであれば、DB接続部は私なら以下のようにします。 <?php function db() { try{ // wordpressのDBとユーザを利用しているならwordpressに設定されている定数を利用するべき $dsn = sprintf('mysql:dbname=%s;host=%s;charset=utf8', DB_NAME, DB_HOST); $pdo = new PDO($dsn, DB_USER, DB_PASSWORD); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); return $pdo; }catch (PDOException $e) { // デバッグ中はいいですが、サービス稼働時にはエラー理由を外部に出す必要はないかと。 // echo $e->getMessage(); return $db = null; } } ?> また、それ以外の区分けは(1)~(4)で区分けした関数で括るということで良いのではないでしょうか。(質問文のスクリプトで書いてある通りってことですかね) >以前読み込みについて調べたところfunctions.phpをrequire_onceされてるエンジニアの方をブログで拝見いたしました。 A.それは多分間違いです。テーマはテーマフォルダの中にあるfunctions.phpは自動的に読みます。 今現在テーマ中に、functions.phpをrequire_once しているのであれば一度外してみてください。動くはずです。 根拠として、wp-settings.phpという、wordpressロード時に読み込まれる設定用PHPの553行目あたりをお読みください。functions.phpが呼び出されているのがわかると思います。 そのエンジニアのブログでは別の意図でそのように記述されているのではないかと思いますが、全文読んでみないと何とも言えませんね。。。 そのうえで、RSSの読み込み用の処理が合わせて200行程度なのであればfunctions.phpに書いて問題ないです。 繰り返して言いますが、functions.phpの中に記述するのが違和感があるのであれば、rss.phpを作成してそれをfunctions.phpの中でインクルードすればよいと思います。 どちらでも処理上の負荷は変わりません。 また、こちらも繰り返しになりますが、関数定義を行っただけでは、実行されないので負荷はかかりません。実行する際に負荷がかかるので、それこそよほど10万行とか書いてあるのでない限りは問題ないです。
お礼
functions.phpの関数は直に読み込まないと扱えないようです 現役エンジニアの方のブログに質問をさせて頂いたところ、下記の文が返ってきました functions.phpを読み込まないとfunctions.phpに書いた関数を使うことはできないので「functions.phpにdb接続を書いて、読み込ませず直に書く」という使い方ができるものではありません。 ですので一つのファイルで完結させたい場合は、list.phpにデータベース接続の関数を書くか、関数を作らずにデータベース接続のコードを直接書く方法になるかと思います。
補足
functions.phpに書いてみたのですが、index.php(固定ページ)には何も記入する必要はないのでしょうか? ※$dbh = db();//接続オブジェクトを保持する そのうえで、RSSの読み込み用の処理が合わせて200行程度なのであればfunctions.phpに書いて問題ないです。 繰り返して言いますが、functions.phpの中に記述するのが違和感があるのであれば、rss.phpを作成してそれをfunctions.phpの中でインクルードすればよいと思います。 どちらでも処理上の負荷は変わりません。 A.了解いたしました。参考にさせていただきます。
- hogehoge78
- ベストアンサー率80% (433/539)
回答者さんの返信が、自分自身の関心ごとだけに寄ってきてしまっているように見えましたので、 基本的な部分でよくわからない箇所をお伺いいたします。 【1】作成されたオリジナルのテーマについて 既存テーマなんかをテンプレートにして改造して、少なくとも、 index.php page.php functions.php あたりは、作成されている、という理解でよろしいですか? 【2】RSSについて 以下の四つの処理を行うもの、ということでよろしいですか? (1)外部RSSの読み込み (2)(1)の取り込み (3)取り込んだRSS情報をテーブルから取り出し (4)(3)をテーマのデザインに合わせた構造に合わせて出力 そして、上記の(2)~(3)は同一データベース、同一テーブルということで間違いないですか? また、RSSの取り込み先データベースは、Wordpressで利用しているデータベースと同様のものではないですか? 【4】有効化されたテーマについて 繰り返しになりますが、テーマが有効化されているなら、テーマフォルダの中にある「functions.php」は自動的にrequire_onceされ、 自分自身で記述を行わなくてもインクルードされた状態になりますが、こちら認識齟齬ありませんか?
補足
index.php page.php functions.php footer.php header.php search.php sidebar.php 上記のファイルは自作しております。 以下の四つの処理を行うもの、ということでよろしいですか そして、上記の(2)~(3)は同一データベース、同一テーブルということで間違いないですか? A.間違いないです。 RSSの取り込み先データベースは、Wordpressで利用しているデータベースと同様のものではないですか? A.同様のものです。格納しているのは記事とRSSで総数を決めて交互に出力するためですので。 テーマが有効化されているなら、テーマフォルダの中にある「functions.php」は自動的にrequire_onceされ、 自分自身で記述を行わなくてもインクルードされた状態になりますが、こちら認識齟齬ありませんか? A.これについて気になる点があるのですが、以前読み込みについて調べたところfunctions.phpをrequire_onceされてるエンジニアの方をブログで拝見いたしました。 なにか設定が必要なのではないでしょうか?
- hogehoge78
- ベストアンサー率80% (433/539)
>共通部分のみfunctions.phpに記入して、それ以外のデータベースを選んで格納する部分はrss.phpにコードを書こうと考えた A.共通部分とは何で、それ以外のデータベースを選んで格納する部分は何か、がわからないので、なんとも言えないですね。 ある程度一連の流れで作ったものは、いつしか切り分けが難しくなったり、後で切り分ける良い方法が思いついたりするものですので、 一旦一緒にしておいた方が良いのでは?と思うのですが。 >functions.phpをrequire_onceで読み込んでいたのですが自身のサイトには様々な設定の記述があるためそちらは使えません A.すみません、こちらも少し具体性がないのでよくわからないです。 基本的にwordpressは現在有効となっているテーマのフォルダの中のfunctions.phpは自動的に読み込むはずなんですが、読み込まないようなことをしているのでしょうか。 >db関連のものは両方に手を出さずに素直にどちらかに寄せるべきですかね…? A.一旦シンプルに考えた方が良いと思いますので、どこかに寄せてしまった方がいいですね。 そして、何かもしかすると若干話がかみ合っていないのかもという気もしてきています。 wordpressを利用するにあたり、利用者が変更してもよい場所というのが決まっていて(別にアップデート非対応覚悟でどこでも触っていいですけど)、 (1)自分自身で書いたテーマの中 (2)自分自身で書いたプラグインの中 (3)DBの中身 それ以外の場所はWordpressのコア部分ですので、書き換えてもWordpress自身のアップデートで上書きされてしまいます。 そして、今回質問者さんの行っている作業は、(1)の中にあるfunctions.php/index.phpなんかに修正を入れているというお話ですよね? もしそうでない、別の場所に何らかの記述を施しているようであれば、全て撤収して、テーマの中で記述するように移動する必要があると思います。 もし、そうであるならば、functions.phpの中に記述するのが最も汚さないと思います。 そして、functions.phpの中が見づらいとか、何らかの理由があるなら、今回新規作成したRSSの取込/表示に関する一連の関数をrss.phpに移動して、 functions.phpの先頭で、 <?php require_once __DIR__ . '/rss.php'; ?> といったインクルード記述をしてやればよいのではないかと思います。
補足
A.共通部分とは何で、それ以外のデータベースを選んで格納する部分は何か、がわからないので、なんとも言えないですね。 A.共通で扱える部分・・・データベースであればDB接続まで(それ以降はテーブルを選択して格納しているため使いまわしできない) ページナビは固定ページ投稿ページの両方で扱うことができ、(今回作成中のテーマでは同じものを使いまわしするため) 上記の部分とテーブルを選んでデータを格納して表示する処理をうまく分けられないかと悩んでおりました。 説明不足で申し訳ないです。 functions.phpをrequire_onceで読み込んでいたのですが自身のサイトには様々な設定の記述があるためそちらは使えません A.functions.phpには管理画面などの設定項目についてのコードを記載済みなため、require_onceでDB接続のためだけに扱うことはできません。 今回質問者さんの行っている作業は、(1)の中にあるfunctions.php/index.phpなんかに修正を入れているというお話ですよね? もし、そうであるならば、functions.phpの中に記述するのが最も汚さないと思います。 functions.phpの先頭で、 <?php require_once __DIR__ . '/rss.php'; ?> といったインクルード記述をしてやればよいのではないかと思います。 A.functions.phpを扱うことも考えましたが、そこからpage.php(固定ページ)にrequire_onceすることが難しいため、今はdb.phpに使いまわしできる接続部分のみ書いて、あとはpage.phpに記述しようと思っております。 index.phpはどうしても使うなと指摘がありましたので、page.phpを固定ページに設定して、index.phpはそちらに不具合が起こった際などに代用するファイルにしようと考えております。
- hogehoge78
- ベストアンサー率80% (433/539)
>本当はfunctions.phpに書きたいのですが200行近いコードがあるので接続部分だけ書こうか迷っております。 A.一回書いておいてしっくりこなかったら別のrss.phpとか用意してそちらに押し込んでもよいとは思います。 自作の関数を押し込んだブロックに過剰な装飾のコメントを入れるようにする、というのでも多少は見やすくなったりします。 <?php /*********************************************************************** * ここから下はRSS関数群 **********************************************************************/ ?> みたいな感じで。 >wp-contentの下のthemesの下の自作テーマのフォルダであればアップデートの影響は受けないでしょうか? A.自作のテーマなのでアップデートの影響は受けないです。影響を受けるのはWordpressが自分で用意した部分だけです。 テーマであれば、もともとあった、twentynineteen、twentytwenty、twentytwentyoneなんかは上書きされる可能性はあります。
補足
一回書いておいてしっくりこなかったら別のrss.phpとか用意してそちらに押し込んでもよいとは思います。 A.どちらの意見もくみ取って共通部分のみfunctions.phpに記入して、それ以外のデータベースを選んで格納する部分はrss.phpにコードを書こうと考えたのですが、接続のみfunctions.phpに書いて、格納からはrss.phpと分けることは可能なのでしょうか? 参考サイトを拝見したところfunctions.phpをrequire_onceで読み込んでいたのですが自身のサイトには様々な設定の記述があるためそちらは使えません。 db関連のものは両方に手を出さずに素直にどちらかに寄せるべきですかね…? 自作のテーマなのでアップデートの影響は受けないです。 A.ありがとうございました。安心しました。
- hogehoge78
- ベストアンサー率80% (433/539)
>大丈夫だと思われます。1つのサーバーにテーマを重複させて使うことなどあるのでしょうか?疑問に思いまして… A.いえ、別のコンテンツで少しデザインなどを変更したテーマを用意して、別件で利用する可能性まで視野を広げていただければ、そんなに疑問になることでもないのかなと思います。 要件はRSS取得だけということであれば、似て非なるコンテンツ思いつくかもしれませんし。 >それ以外の格納や表示などはpage.phpなどの固定ページに直に書き込んでいいのでしょうか? A.Wordpressもそんなに規則に厳密なCMSではないのでどこに書くのも自由といえば自由です。 私なら、functions.phpがまさに「関数を定義する場所」として提供されているわけですので、そこに記述します。 定義しても呼び出さなければ負荷もないわけですので。 >index.phpに直接書いた場合アップデートなど、どんな問題が起きても誰もわからない、アドバイスできないといわれたので心配になってました… A.index.phpがどこに配置されたものか、それが何を意味するのか、というところを明記されていなかったのではないですか? 質問者さんが作成したテーマの中のindex.phpなのであれば特に問題はないと思います。 wordpress直下、wp-content直下、wp-admin直下にもindex.phpがあります。 それらはwordpress自身をアップデートすると修正したものは上書きされて元に戻ったりするわけですので、追加するのは悪手です。 >プラグインを自作する方法を忘れておりました、自作するのはセキュリティ面で多少不安なのですがDBの情報が漏れたりしないでしょうか? A.質問者さんが自分専用に自分だけが使うのであれば別に問題ないのでは、と思います。 DB名やPWがWordpressで利用されているものと同様なようであれば、wordpress直下に、wp-config.phpというものが存在すると思いますので、 そこに記載されている接続用の情報を使うようにすればよいだけでもありますが。 define関数で表現されているのがいわゆる定数、ですので、wp-config.phpの中に記述されているものだと <?php echo DB_NAME; // データベース名が表示される echo DB_USER; // データベースの利用権限者のユーザID echo DB_PASSWORD; // データベース利用者のパスワード echo DB_HOST; // データベースのホスト名 ?> といったものが今回PDOに食わせるパラメータで使えるのではないですか? また、他に必要な情報があれば、当該ファイルに <?php define('YOUR_CONST', '←好きな名前で定義すればよいと思います。'); ?> 色々書きましたが、サービス(コンテンツ)が出来上がってから考えるのでも良いように思います。 いずれにしてもこの手の話は今はそれでよいかなと思っても時間がたつとなんか違う気がしてくるものです。 PDO使うのではなくてWPの用意したDBアクセスクラス使って統一したくなるかもしれないわけですしね。
お礼
データベースを利用したほかのコンテンツに代用するときの話ですね理解できました。 私なら、functions.phpがまさに「関数を定義する場所」として提供されているわけですので、そこに記述します。 定義しても呼び出さなければ負荷もないわけですので。 A.functions.phpに書き込みすぎると、見にくいエラーにつながりやすいなどの意見もありましたので、共通で扱う項目のみでもいい気がするのですがどうでしょうか? RSSは固定ページと投稿記事ページ両方に扱うので本当はfunctions.phpに書きたいのですが200行近いコードがあるので接続部分だけ書こうか迷っております。 別のファイルに分けてその都度呼び出すほうがわかりやすいのか… 質問者さんが作成したテーマの中のindex.phpなのであれば特に問題はないと思います。 A.wp-contentの下のthemesの下の自作テーマのフォルダであればアップデートの影響は受けないでしょうか? 質問者さんが自分専用に自分だけが使うのであれば別に問題ないのでは、と思います。 A.ありがとうございます。
- hogehoge78
- ベストアンサー率80% (433/539)
前回の質問を知っているので回答するのですが、前提として、「Wordpress」を利用している、ことを明記した方がいいです。 CMSなので、そのCMSの中でだけで通じる方言/規則のようなものがありますので、その点、ご留意ください。 wordpressのfunctions.phpについてですが、これは各テーマ固有の設定値を設定したり、テーマ内で利用したい関数を定義したりするときに、追記・修正を行うものになります。 前回からの文脈でRSSを収集/表示したい、ということだと思うのですが、なんらか別のテーマを利用したい場合に、テーマ内のfunctions.phpに追記すると、再利用する場合にも該当の一連の処理全部を別のテーマのfunctions.phpにコピーしなければならなくなります。 それで問題ないようでしたら、functions.phpに書くことに何ら問題はないと思います。 結局どのようにコーディングするかは、今後のスケジュールによるものと思いますので、一概に決めつけることもできません。 例えば、PDOの接続情報を取得する処理なんかは、RSS以外の何らかの処理を行うにあたっても使うわけですので、db.phpみたいなものに切り出すことも設計方針としてはありだと思います。 db.phpに接続情報を返す関数だけ追い出しておけば、読み込みファイルを変えて実行することもできるわけです。 でもそれは、今後別のサーバのDBからもデータを操作する必要があるときに意味がありますが、今後もそんなことがないなら必要はないと思います。 また、いろいろな準備や別のことを行わなければいけないのでここでは詳細説明しませんが、Wordpressにはプラグインという機能があります。 今回の一連のRSS収集/表示機能をプラグインとして切り出して、プラグインが有効な場合のみ実行される、ということも可能かと思います。 参考: https://wpdocs.osdn.jp/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%AE%E4%BD%9C%E6%88%90
補足
「Wordpress」を利用している、ことを明記した方がいいです。 A.了解しました。 問題ないようでしたら、functions.phpに書くことに何ら問題はないと思います。 A.大丈夫だと思われます。1つのサーバーにテーマを重複させて使うことなどあるのでしょうか?疑問に思いまして… 例えば、PDOの接続情報を取得する処理なんかは、RSS以外の何らかの処理を行うにあたっても使うわけですので、db.phpみたいなものに切り出すことも設計方針としてはありだと思います。 A.共通部分をdb.phpに書き出すのが自然だということですね。 それ以外の格納や表示などはpage.phpなどの固定ページに直に書き込んでいいのでしょうか? require_onceでデータベース周りの処理を読み込んでみてはどうかという指摘もありましたが、通常は共通項をdb.phpなどに書き出すように思えるのですが。 でもそれは、今後別のサーバのDBからもデータを操作する必要があるときに意味がありますが、今後もそんなことがないなら必要はないと思います。 A.index.phpに直接書いた場合アップデートなど、どんな問題が起きても誰もわからない、アドバイスできないといわれたので心配になってました… index.phpの前にfunctions.phpが読み込まれるためそちらから記入してpage.phpを固定ページとして認識するようphpファイルの先頭で宣言した後で、index.phpにはrequire_onceのみ書くようにアドバイスをいただいたので、そのように作ろうと思うのですが。 また、いろいろな準備や別のことを行わなければいけないのでここでは詳細説明しませんが、Wordpressにはプラグインという機能があります。 A.プラグインを自作する方法を忘れておりました、自作するのはセキュリティ面で多少不安なのですがDBの情報が漏れたりしないでしょうか?
お礼
すみめせん。スペースがないのでこちらにコメントします。 下記のような解釈であってますでしょうか? //表示 for ($i = 0; $i < $block_per_page; ++$i) {//投稿よりもページあたりブロック件数のほうが多い echo '<h2>ブロック</h2>'; echo '<h3>RSS</h3>'; for ($j = 0; $j < $rss_per_block; ++$j) {//ページあたりのRSS数よりもブロックあたりRSS件数のほうが多い $item_index = $i * $rss_per_block + $j;//投稿のアイテム数=ページあたりの投稿数×ページあたりのブロック件数 if ($item_index >= count($rss_items)) {//もし投稿のアイテム数が大きいならRSSアイテムをカウントするのをやめる break; } $item = $rss_items[$item_index];//アイテム=RSSアイテム 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)) {//もし画像が空の場合 $img = 'wp-content/uploads/2021/12/EXt1cESWAAAwdOY.jpg'; } else { $img = $item->img;//画像を取得する } echo "<li><a href=\"{$item->link}\"><img src=\"{$img}\" width=\"100\"></a></li>"; echo '</ul>'; } $rss_per_page = $block_per_page * $rss_per_block; //ページあたりRSS件数=ページあたりブロック件数×ブロック当たりのRSS件数 $rss_offset = ($current_page - 1) * $rss_per_page; //RSSオフセット=現在いるページ-1×ページあたりRSS件数 $sql = 'SELECT * FROM rss_feed ORDER BY date DESC LIMIT ?,?';//現在時刻 $stmt = $dbh->prepare($sql); $stmt->bindParam(1, $rss_offset, PDO::PARAM_INT);//RSSオフセットを受け取る $stmt->bindParam(2, $rss_per_page, PDO::PARAM_INT);//ページあたりRSS件数を受け取る $stmt->execute(); $rss_items = $stmt->fetchAll(PDO::FETCH_OBJ);//RSSアイテム=SQLの結果を取ってくるメソッド