プロが教えるわが家の防犯対策術!

色々な意見をもとにwordpressのファイル構成を決めたのですが、わからない点があります。
以下が決めた内容となっております。
データベース関連→db.php
共通部分→データベースの接続とページナビはfunctions.php
表示部分→page.php
index.php→目次の役割?page.phpがエラーが出ているときにメンテナンス中表示されるもの

※わからない点
データベースに接続する際の処理(try文)をfunctions.phpに書きたいのですが、別のファイルで使う際に、require_onceを使って読み込ませる以外の方法はありますでしょうか?
functions.phpそのものを読み込ませてしまうとfunctions.phpに記載しているデータベースと関係ないコードまで読み込んでしまいます。

※functions.phpに記載するもの
<?php
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 'データベースへの接続が出来ました';
} catch (PDOException $e) {
echo $e->getMessage(); // err時はメッセージを表示
exit;
}

※接続から先の処理(page.php)
$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保存
$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=?');


…以下略

A 回答 (4件)

ちょっと話それちゃっていますが、参考にしたページはこれですか?


https://simple-was-best.com/blog-entry-wordpress …

これ、明らかに不必要な説明になっていますね。
外部の仕組みから強引にWordpressのDBを操作しようとしているように見えます。
Wordpressの仕組みに乗っかっているなら、意図的にrequireなんてする必要ありません。

もしかしてやろうとしていることは、Wordpressのカスタマイズやそのプラグインの作成とかじゃなくて、Wordpressの機能を都合よく利用した独自システムの構築ですか?
そうであるならば私から回答することはもはやありません。

なお改めですが、wp-load.phpをrequireするしないに関わらず、セキュリティ情報がどこかのファイルに存在して、そのファイルがドキュメントルート配下に存在するならば、ファイル名について推測されやすい、されにくいの度合は異なりますが、セキュリティのザルさは変わりません。
攻撃者は何もWordpressにだけ焦点を当てて攻撃してくるわけではないので。
つまりこれはどこまで行っても、レンタルサーバの制約がある以上、『wordpressから推奨されないドキュメントルート内に設置して対策する』と同義です。
    • good
    • 1
この回答へのお礼

そちらの方を参考にいたしました。
つまりはどの方法を使用してもドキュメントルート下にある場合はセキュリティの対策が必要だということですね…
wordpressの機能を都合よく使って作りたいわけではなく、RSSを外部から取得してデータベースに保存したものを表示させるプラグインのようなものを作りたいだけです。
$wpdbのみで特定のデータベースやテーブルにどのようにアクセスするのでしょうか?
config.phpを通すか、create tableを使用するしか方法はない気がするのですが。ページごとに読み込む必要がない場合、必要ないと思いますがページごとに異なるRSSを表示させるにはload.phpのようにDB接続する必要があります。

お礼日時:2022/02/08 17:39

wp-load.phpではなく、セキュリティ情報が含まれるwp-cofig.phpがドキュメントルート下にあるのがセキュリティ上よろしくないということだと思います。


これは、そういう制約のレンタルサーバであるならば回避しようがありません。
せいぜい適切なパーミッションの設定と、htaccessで直接アクセスを拒否するなど程度に落ち着くでしょう。
そういった方法論が最大限の対策になります。
それを言い出したら、index.php以外がドキュメントルート下にあるのがおかしいのです。
(そういう風にするための方法論をHPに載せてる方もいる)

それを理由に他のファイルにセキュリティ情報を書いてたら問題としては同じことです。
むしろWPの仕組みとしてもセキュリティとしても悪化させます。
よって、そんなことをする意味がありません。

WP自体はセキュリティに対する思想が弱いですから、そこを可能な限り完璧を求めようとするなら、融通の利くレンタルサーバに乗り換えて、index.php以外はドキュメントルート外に配置して適切なパーミッションを設定することです。

どこでコードを書こうとしているのかわかりませんが、WPのルーティングの流れに乗ってる中での処理なら、wp-load.phpをrequireせずとも、DB操作を必要とするタイミングで、
global $wpdb;
を宣言するだけで済むはずです。
    • good
    • 0
この回答へのお礼

$wpdbにアクセスするためというよりも、wordpressのデータベースにアクセスするためのアクセス情報がありますよね?SQLサーバのURLだったり、ユーザ/パスワードであったりと。

こういった情報をプラグインのPHPなどのコードに直接書き込むのは正直セキュリティ的にも良くないですし、何よりも冗長になります。

WordPressではこういったDB情報は全てwp-config.phpに纏められているので、これを使いましょう。wp-config.phpの中身ではこんな感じでDB情報を纏められています。

上記のようにどうしてもwp-load.phpは必要なようです。
wordpressのほうでも作成するつもりなので、その際はよろしくお願いします。
セキュリティの対策は多すぎてきりがないと思い、方法を切り替えました。
wordpressから推奨されないドキュメントルート内に設置して対策するのと、wordpressの関数を避けて特定されないようにする?のはどちらが良いかと考えたうえで後者を選びました。
不適切な発言があり申し訳ありませんでした。

お礼日時:2022/02/08 00:35

$wpdbを使えばいいと思いますが、全く別のDBへ接続して制御を行いたいのですか?


利用しているWordpressのDBを利用したいなら、接続処理なんて書く必要ありませんよ。
INSERTやDELETEなどの命令も用意されています。
https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83% …


ファイルの在り方やお作法を無視してごりごり書きまくっていて、もはや手が付けられない状態に陥っているなら、それがそのシステム作り方、として確立されてしまっているので、よほど大掛かりに修正しなければどうしようもないと思います。
    • good
    • 0
この回答へのお礼

説明不足ですみません。$wpdbを扱う方法で初期コードは完成していたのですが、ドキュメントルート内からwp-load.phpを通すのはセキュリティの問題上絶対にダメだとご指摘がたくさんあり断念しております。
ドキュメントルート外からモジュールを通すことはレンタルサーバーのプラン上コストを考えて不可能なので、1からphpを使いDBを扱っております。
この時点でルールを無視しているのは承知ですが、ウイルスの危険がありレンタルサーバーからも推奨されていない方法で組むことはできません。

お礼日時:2022/02/07 17:37

案1


「データベースに接続する際の処理」を connect_db.php に移し、
「データベースと関係ないコード」を functions.php に残す。

案2
functions.php には関数定義だけさせて、
require_once の後で必要な分だけ関数呼び出しする。
    • good
    • 0
この回答へのお礼

案1はページナビの機能のみをfunctions.phpに残して、データベースに接続する処理をconnect_db.php に移し、表示をindex.php(固定ページ)で行う方法ということですね。

案2はfunctions.phpにすべての機能を入れて、require_onceをindex.phpで使いデータベースに接続した後に関数呼び出しで表示させる方法ですね。

案2の方法で1つの問題がありまして、functions.phpにはすでに管理画面などの追加コードが入っており、データベースのためだけに贅沢に扱えません。過去のアドバイスからすると、require_once functions.phpとするのはwordpressのルール違反のようです。本来はwp-load.phpを使いデータベースに接続をして、そのほかの記載はindex.php(固定ページ)に書くとこべきですが。
レンタルサーバーのルールでドキュメントルート外にwp-load.phpを置けないため、セキュリティを考慮してRSSを取得する機能を自作いたしました。

お礼日時:2022/02/06 01:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!