dポイントプレゼントキャンペーン実施中!

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);
}

?>

A 回答 (2件)

> functionsで書いたものはpage.phpでも問題なく表示できるのでしょうか?



どう書くかでしょうね。
functions.phpが単なるメソッドの集合体なら使えるでしょう。

> ページナビをRSSと記事の総数で求めていた場合db.phpとfunctions.phpのどちらに書くほうが適切でしょうか?

よくありがちなのは、SELECT COUNT(*) とかで件数をDBから引くやり方ですかね。
自分なら無駄にクエリを発行せず、SELECTした連想配列をfunctions.phpでcount()します。
    • good
    • 0
この回答へのお礼

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

接続の際にtry文をfunctions.phpに書きたいのですが、他の記述も読み込まれるためrequire_onceでfunctions.phpを読み込ませられないようです。
ファイルを読み込ませずに記述のみでpage.phpのDB処理につなげることは可能でしょうか?

お礼日時:2022/02/05 15:54

> 役割によって分けるべきという方と、page.phpのみfunctions.phpを使いそのほかはrequire_onceで読み込めばいいという方と、すべてrequire_onceで読み込めばいいという方の3パターンありました。



正直どれでもいいです。
というか、正解は無いです。
私はindex.php(アクセスされるファイル)には基本的にほとんど処理を書かず、メインの処理をするパーツ、DBへクエリを発行するパーツ、HTMLを生成するパーツみたいに分けます。
なぜファイルを分けるのかの一つの考え方として、変更があった場合に影響範囲を局所化するという事があります。
例えば私の例で言えば、DBのメジャーバージョンが上がるとか別のDB製品に乗り換える場合には、DBへクエリを発行するパーツだけ修正すれば他は動く“ハズ”ですから、そこは面倒を見なくて済みますね。

こういうのはプロダクトの規模にもよるし、その後にどれぐらい手を加えていくのかにもよるので、あなたが必要性を感じないなら別にファイルを分けなくてもいいと思いますけどね。
    • good
    • 0
この回答へのお礼

貴重なアドバイスありがとうございます。
共通に使えるものをdb.php(データベースの接続など)を別ファイルに分けて
他はrequire_onceで読み込むのはどうかとアドバイスをいただいていたのですが、エラーはできるだけわかりやすくしたいので
db.php(データベースへの接続以外)
functions.php(ページナビやデータベースへの接続など共通項の処理)
index.php…page.phpの代わりの固定ページ(footer,header,page.phpなどメインの固定ページに表示する内容をrequire_onceで読み込む)
page.php…固定ページ(ページでエラーが起きたときにメンテナンスできるようindex.phpは代わりの固定ページにする)

※page.phpには表示部分のみを書くほかはrequire_onceで読み込む{データベースの格納など}

疑問点が2つあるのですが、functionsで書いたものはpage.phpでも問題なく表示できるのでしょうか?
ページナビをRSSと記事の総数で求めていた場合db.phpとfunctions.phpのどちらに書くほうが適切でしょうか?

お礼日時:2022/02/04 22:24

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