• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:WordPressの質問(q10013003)の続)

WordPressの質問(q10013003):$offsetのコントロール方法は?

このQ&Aのポイント
  • WordPressの質問(q10013003)の続【投稿ページ その3】で、break,continue構文以外で$offsetをコントロールする方法について教えてください。
  • 質問内容を要約すると、$offsetをコントロールするための良い方法を探しているとのことです。
  • 回答としては、データベースから取得したRSSを分けて保存し、そのまま出力する方法をおすすめします。この方法ならループをせずに$offsetをコントロールできます。また、画像1,画像2,画像3のURLについても同じサイトから取得する予定であれば、storage_rss.phpと処理を分ける必要はありません。SQLから操作するかどうかは詳細がわかりませんが、必要に応じて使い分ければ良いでしょう。

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

  • ベストアンサー
  • dell_OK
  • ベストアンサー率13% (776/5751)
回答No.85

ところで、確認したいことがあります。 front-page.phpとpage-secound.phpとpage-third.phpの違いは、画像数が1か2か3でその一覧表示スタイルと、RSSの取得元だけで、ランキング表示その他は、それぞれの画像数の記事になるだけで、デザインは同じですよね。 それと、3パターンあると言われていた、アーカイブとカテゴリーと検索は、その一覧表示のデザインがfront-page.phpとpage-secound.phpとpage-third.phpのように異なるだけで他は同じですよね。

php_learn
質問者

お礼

ファイル自体を識別させて表示方法の切り替えを行うのか、それぞれの機能の箇所で分岐を行うのかどちらかになると思われます。

php_learn
質問者

補足

おっしゃる通りです。それぞれfront-page.php,page-secound.php,page-third.phpと同じデザイン記事表示になります。 画像数が異なるため、間接的にカスタムフィールドで表示ファイルの切り替えを行うように考えています。

すると、全ての回答が全文表示されます。

その他の回答 (84)

  • dell_OK
  • ベストアンサー率13% (776/5751)
回答No.44

【アーカイブ その1】 参考サイトを見てみました。 ・ウィジェットを使う 複雑すぎ。 ・phpかデータベースで作る submitするのでよくない気がする。 ・1から作る これが一番簡単そうです。

php_learn
質問者

お礼

目指しているデザインのコードが2つありまして、プルダウンが1段階のものと2段階のものになります。 実装が難しそうであれば1段階のものにする予定です。 難しそうな2段階目からになるんですが、いろいろ調べていくうちに少しだけ分かりました。 下記コードから1段階目を選択後に2段階目で選択枠が消えるもしくは1段階目と2段階目の選択枠が1つの機能になることを想定しております。 現在は枠が2つある状態です。最後に選択されたものをSQLに渡しarchive.phpで表示する想定をしています。 アドバイスを頂いたのですが、イベント処理を利用しているようなので処理内で、値が""でないことを条件に、要素の style.visibility = 'hidden' に設定しておけばよいのではないでしょうか? display = 'none' でも良いですけれど、その場合は表示レイアウトが詰められます。この意味がよく理解できませんでした。 おそらく<select name="OS">か<option value="">にidを設定してそれを判定して、if分岐させることだと思うのですが… 昨日載せていた方法は+で開くことができず、初めの選択ボックスの箱がなかったため別の方法を考えました。 ※1から作る場合 https://ateitexe.com/wordpress-accordion-archives/ ※参考サイト https://blog.ver001.com/javascript-select-options-change/#comment-233 https://bonoponz.hatenablog.com/entry/2020/05/12/%E3%80%90Web%E3%80%91%E3%83%97%E3%83%AB%E3%83%80%E3%82%A6%E3%83%B3%E3%81%A7%E8%A1%A8%E7%A4%BA%E5%86%85%E5%AE%B9%E3%82%92%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%82%8B https://www.pazru.net/js/DOM/7.html //2段階式プルダウン <select name="OS"> <option value="">OSを選択</option> <option value="Windows">Windows</option> <option value="Android">Android</option> <option value="iOS">iOS</option> <select> <select name="version"> </select> <script> let versionArray = new Array(); versionArray[''] = new Array('バージョン情報'); versionArray['Windows'] = new Array('XP', 'Vista', '7', '8', '8.1', '10'); versionArray['Android'] = new Array('7 (Nougat)', '8 (Oreo)', '9 (Pie)', '10'); versionArray['iOS'] = new Array('10以下', '11', '12', '13'); document.getElementsByName('OS')[0].onchange = function () { let os = this.value; let elm = document.getElementsByName('version')[0]; elm.options.length = 0; for (let i = 0; i < versionArray[os].length; i++) { let op = document.createElement('option'); op.value = versionArray[os][i]; op.textContent = versionArray[os][i]; elm.appendChild(op); } }; window.onload = function () { document.getElementsByName('OS')[0].onchange(); }; </script> //1段階式プルダウン <select name=”archive-dropdown” onChange=’document.location.href=this.options[this.selectedIndex].value;’> <option value=””><?php echo attribute_escape(__(‘Select Month’)); ?></option> <?php wp_get_archives( ‘type=monthly&format=option&show_post_count=1’ ); ?> </select> ※参考サイト https://kubogen.com/web-wordpress-009/

php_learn
質問者

補足

アドバイスありがとうございます。 先ほどアドバイスをいただきまして、$argsで表示、SQLで取得、javascriptでプルダウン作成が一番よさそうです。wp_get archivesを使い表示させます。 meta_keyが使えないので、SQLでテーブルを組み合わせるか単独で使えるのか判断する必要があります。 最初のselect要素の選択を変更したら、2つ目のselect要素の選択肢(内包されているoption要素)を書き替えることは、ブラウザ側での動作なのでJavaScriptでする。 phpで出来ることは、 1.JavaScriptに埋め込む選択肢の定義などをサーバ側のphpで動的に生成いして出力する 2.選択肢が多すぎてあらかじめ記載しておくのが不適なケースで)選択されたものによって(XMLHttpRequestで)サーバから展開すべきoption要素を取得する(そのサーバ側の処理をphpで書く)

すると、全ての回答が全文表示されます。
  • dell_OK
  • ベストアンサー率13% (776/5751)
回答No.43

【ページナビ その3】 ・全角にしてみたのですが、下記のようなコードでいいのでしょうか? はい、いいと思います。

php_learn
質問者

お礼

こちらが最新の質問になります。 1週間Javascriptについて考えていたのですが、どうやらwordpressはフロントデータの送受信は出来ないようなので、工夫が必要なようです。幾つかアドバイスを頂いたのですが、直ぐに作成できるようなものでもなさそうです。 そこで、既存のウィジェットからclass変更して作成する方法に切り替えようと考えています。 アーカイブと別の質問になるのですが、RSSにおいてカテゴリーボタン($subject)の文字数を10文字で制限したい場合、どのように組めばいいでしょうか? 下記のコードを参考にしたのですが、組み替えても上手くいかず困っております。アドバイスよろしくお願い致します。 $title= mb_substr($post->post_title, 0, 20, 'UTF-8'); ※該当箇所 $subject = "<a href=\"{$item->link}\">{$item->subject}</a>"; ※エラーの出ているコード Warning: mb_strlen() expects at most 2 parameters, 3 given $subject = mb_strlen(strip_tags($item->subject), 0, 10); $subject = "<a href=\"{$item->link}\">{$subject}</a>"; ※参考サイト https://www.m-hand.co.jp/program/5130/ ※該当ファイル https://wandbox.org/permlink/0G78kAuo87VvR4kE

php_learn
質問者

補足

追加でアドバイスを頂きました。 >let os = this.value; の次に、  if(os) this.style.visibility = 'hidden'; の1行を追加しておけば、ひとまず、ご質問のようになるかと。 ただし、非表示にするだけで、イベント設定等はそのままです。

すると、全ての回答が全文表示されます。
  • dell_OK
  • ベストアンサー率13% (776/5751)
回答No.42

【ページナビ その2】 気づいたことがありましたので、私から訂正です。 ページナビで使っている記号<と>ですが、HTMLタグの記号なのでよくありませんでした。 全角文字で<と>にしていただくか、特殊文字として&lt;と&gt;で出力してください。 特殊文字にするとこんな感じです。 ----変更前 $page_text = '<<'; $page_text = '<'; $page_text = '>'; $page_text = '>>'; ----変更後 $page_text = '&lt;&lt;'; $page_text = '&lt;'; $page_text = '&gt;'; $page_text = '&gt;&gt;'; ----

php_learn
質問者

お礼

上記のファイルにscriptタグが入っておりました。 申し訳ありません。 https://wandbox.org/permlink/f0UUkAWTRUQmase7

php_learn
質問者

補足

アドバイスありがとうございます。 全角にしてみたのですが、下記のようなコードでいいのでしょうか? /* ここまで追加 */ for ($i = 1; $i <= $pages; ++$i) { if (1 == $i) { $page_text = '<<'; echo "<a href=\"?page={$i}\">{$page_text}</a> "; if ($current_page > 1) { $j = $current_page - 1; } else { $j = 1; } $page_text = '<'; echo "<a href=\"?page={$j}\">{$page_text}</a> "; } if ($i >= $current_page && ++$display_page_count <= $display_pages) { $page_text = $i; echo "<a href=\"?page={$i}\">{$page_text}</a> "; } if ($i == $pages) { if ($current_page < $pages) { $j = $current_page + 1; } else { $j = $pages; } $page_text = '>'; echo "<a href=\"?page={$j}\">{$page_text}</a> "; $page_text = '>>'; echo "<a href=\"?page={$i}\">{$page_text}</a> "; } } ?> </div> </div> </div> <!--ここまで-->

すると、全ての回答が全文表示されます。
  • dell_OK
  • ベストアンサー率13% (776/5751)
回答No.41

④最後はアーカイブについてになります。 記載されていたコードで難なくarchive.phpに遷移できますね。 これでいいと思いますが、ご希望は二段階式。 参考サイトをもとにやってみてください。 ただ、私はJavaScript(jQuery)やスタイルシートについては詳しくありません。 PHPとはあまり関係のない話しになるかと思いますので、私がわからないような内容の場合は、別途JavaScriptの分野で質問していただくことになるかも知れません。

php_learn
質問者

補足

プルダウン形式でウィジェットを使う際に1つ懸念点があります。 html classを設定するために既存のコードをfunctions.phpにコピーして修正しなければなりません。 これがかなり大変です。 そこで代わる方法を3通り見つけました。 1つはphpで組み切る、2つめはデータベースから作成する、3つめは参考サイトを見ながらすべて作成する。 データベースかPHPのみで作成する方法が良いと思うのですが、何かアイデアはありますでしょうか? ※ウィジェットを使う場合 https://sachips.byeto.jp/wordpress/recent-entry-html-custom.html ※phpかデータベースで作る場合 https://www.sejuku.net/blog/79855 ※1から作る場合 https://ateitexe.com/wordpress-accordion-archives/

すると、全ての回答が全文表示されます。
  • dell_OK
  • ベストアンサー率13% (776/5751)
回答No.40

①functions.phpを見返してみたのですが、週間ランキングと月間ランキングの$key = '';が同じものになっておりました。 修正してみたのですが問題ないでしょうか? 問題なさそうです。 ②カテゴリーページと検索ページについてお聞きしたいのですが、アクセスカウントがそれぞれあります。 こちらのカウンターは月間ランキングを測る素になっているのか、それとも消し忘れている不要なコードなのかどちらに該当するのでしょうか? 消し忘れだと思います。 ついでに、いらないものがあるので削除してください。 ---- if (is_category() && !is_user_logged_in() && !isBot()) : //個別記事 かつ ログインしていない かつ 非ボット category_views_week(); //アクセスをカウントする endif; category_views_week(); //アクセスをカウントする ---- カテゴリーページはふたつ目のcategory_views_week()は不要です。 カウントアップされないとのことでテストのために無条件実行させるためにここに書いていただいたものです。 条件内で実行されればいいのでここは削除してください。 検索ページでは、ここは全部削除してください。 カテゴリーのカウントアップ処理ですので、検索は不要です。 ---- if (is_single() && !is_user_logged_in() && !isBot()) : //個別記事 かつ ログインしていない かつ 非ボット set_post_views(); //アクセスをカウントする endif; ---- カテゴリーページも検索ページもここは全部削除してください。 投稿記事のカウントアップっぽい処理ですが、それは投稿ページですることですので不要です。 ③コメント欄についてどうしても心残りなことがありまして、画像ごとにコメントの出力の順番をかえたいのですが、 表示するときに分岐させるしか方法はないのでしょうか?コードが長く分かりず辛くなりそうなため懸念しております。 get_comments()の引数で順番を指定することができます。 $argsの設定でorderbyを追加してください。 ---- /* コメントオブジェクトの取得 */ $args = [ 'author__not_in' => '1', /* 管理者を除く */ 'status' => 'approve', /* 承認済み */ 'type' => 'comment', /* コメント */ 'orderby' => '',/* 順番 */ ]; ---- https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/get_comments

すると、全ての回答が全文表示されます。
  • dell_OK
  • ベストアンサー率13% (776/5751)
回答No.39

【RSS その46】 ・画像の分岐コードを書き換えることは可能でしょうか? どのように書き換えたいのかわかりませんが、可能です。

php_learn
質問者

お礼

投稿ページと固定ページを1段階終えたため質問が複数あります。 ※該当ファイル https://wandbox.org/permlink/UhW5EAnVKI9R1mz6 ①functions.phpを見返してみたのですが、週間ランキングと月間ランキングの$key = '';が同じものになっておりました。 修正してみたのですが問題ないでしょうか? ②カテゴリーページと検索ページについてお聞きしたいのですが、アクセスカウントがそれぞれあります。 こちらのカウンターは月間ランキングを測る素になっているのか、それとも消し忘れている不要なコードなのかどちらに該当するのでしょうか? ③コメント欄についてどうしても心残りなことがありまして、画像ごとにコメントの出力の順番をかえたいのですが、 表示するときに分岐させるしか方法はないのでしょうか?コードが長く分かりず辛くなりそうなため懸念しております。 ④最後はアーカイブについてになります。archive.phpを作成してコンテンツを表示することになると思うのですが、 front-page.phpでアーカイブ機能を実装する際に2通りの方法を見つけました。 考えてるデザインがありまして、年月を選択というボタンをクリックさせて見えなかった年月を表示させます。 これが長すぎると見にくい為、年だけ最初のクリックで表示させたのち月をクリックで表示させます。2段階プルダウンを作成したいです。 phpで調べたのですがなかったため仕組みが分かりませんでした。PHPのみで作成するのがベストですが、何かよい方法などはありますでしょうか? 参考サイトのコードですと構文エラーが出ましたので、下記にクォートを修正して載せておきます。 <!--アーカイブ--><select name="archive-dropdown" onchange="document.location.href=this.options[this.selectedIndex].value;"> <option value=""><?php echo esc_attr( __( 'Select Month' ) ); ?></option>> <?php wp_get_archives( array( 'type' => 'monthly', 'format' => 'option', 'show_post_count' => 1 ) ); ?> </select> 1つめはjavascriptを使いwordpressの既存のアーカイブ機能を拡張させて使う(myscript.jsファイルを作成して読み込む) 2つめはプルダウンを自作コードで作成して加えて折り畳み機能を作成する ※参考サイト https://kubogen.com/web-wordpress-009/ https://nelog.jp/folding-archive-widget

php_learn
質問者

補足

RSSテーブルとcronを1つ1つ削除して、storage_rss.phpのimg src="wp-content/uploads/2022/07/14-150x150-1.jpg" width="100"を削除して、 元の$img = '';に戻したところ上手くいきました。申し訳ありません。 すべて画像パスが必要だと誤認しておりました。今はファイルごとのパスからダミー画像を設定しております。 ※ダミー画像はテストのため変更しております。 https://imgur.com/wSUFhKY.jpg // RSSサイトのURLを取得 引数(テンプレート番号)戻り値(RSSサイトのURL配列) $url1 = get_rss_site_url($template_number); 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 = (string) $item->title; $link = (string) $item->link; $content = $item->children('content', true); $result = preg_match('/<img[^>]*src=\"([^"]+)\"[^>]*>/i', $content->encoded, $matches); if (1 == $result) { $img = $matches[1]; } else { $img = ''; } $subject = (string) $dc->subject; $data = array('title' => $title, 'link' => $link, 'date' => $date, 'img' => $img, 'subject' => $subject); $format = array('%s', '%s', '%s', '%s', '%s'); $wpdb->replace($rss_table_name, $data, $format); } } } これからアーカイブページを作成して、その後にコードを圧縮したいと思っております。 お礼するに質問を追記することになるのですが、よろしくお願い致します。

すると、全ての回答が全文表示されます。
  • dell_OK
  • ベストアンサー率13% (776/5751)
回答No.38

【RSS その45】 ・コピーして貼り付けてテーブルを削除してみましたが、URLが変更できません。 キャッシュが原因でもないので、何かしらのコードが原因だと思われます。 そうですね。 ソースで見ると、以下のようになっています。 ---- <img src="wp-content/uploads/2022/07/14-150x150-1.jpg" width="100"> ---- ファイル名がFIGURE-141392.jpgにもなっていないですし、置き換えていないコードがまだあるのではないですか。

php_learn
質問者

補足

下記ファイルにすべてのコードを表示しているのですが、画像コードは書き換えております。 画像の分岐コードを書き換えることは可能でしょうか? https://wandbox.org/permlink/iMtDSjHjdFSd3MDs

すると、全ての回答が全文表示されます。
  • dell_OK
  • ベストアンサー率13% (776/5751)
回答No.37

【投稿ページ その19】 ・スコープが効いていないという意味が理解できていないのですが、 グローバルスコープ関数内のどこからでも取得できる=<?php ?>内に$postの中身を指定しているものがあるから必要ないということでしょうか? そんな感じです。 スコープがきいていないのは関数の中とかです。 例えば、ここでは使えますが、 ---- <?php echo $post->ID; ?> ---- 関数の中では使えません。 ---- <?php function display_id() { echo $post->ID; } ?> ---- 関数の中で使いたい場合に、globalを定義します。 ---- <?php function display_id() { global $post; echo $post->ID; } ?> ---- まだHTMLコメントが残っています。 ---- <!-- カスタムフィールドの取得 --> ----

php_learn
質問者

補足

回答ありがとうございます。理解することができました。 修正致しました。

すると、全ての回答が全文表示されます。
  • dell_OK
  • ベストアンサー率13% (776/5751)
回答No.36

【RSS その44】 ・ダミー画像を操作しているのは下記コードのみでしょうか? ここだけです。 wp-contentで始まるURLは使えないのでフルパスを書いてください。 もう一度これを試してください。 手で入力せずコピーしてください。 ---- $img = 'https://www.gdsgdsgsd.cfbx.jp/wp-content/uploads/2022/06/FIGURE-141392.jpg'; ---- もし変化がなければ、そのコードをください。

php_learn
質問者

補足

コピーして貼り付けてテーブルを削除してみましたが、URLが変更できません。 キャッシュが原因でもないので、何かしらのコードが原因だと思われます。 view-source:http://www.gdsgdsgsd.cfbx.jp/%e7%94%bb%e5%83%8f2%e3%82%bf%e3%82%a4%e3%83%88%e3%83%ab1/

すると、全ての回答が全文表示されます。
  • dell_OK
  • ベストアンサー率13% (776/5751)
回答No.35

【RSS その43】 なるほど。 imgのsrcが相対的に参照されているようです。 ここを、 ---- $img = 'wp-content/uploads/2022/07/14-150x150-1.jpg'; ---- こうしてみてください。 ---- $img = 'https://www.gdsgdsgsd.cfbx.jp/wp-content/uploads/2022/07/14-150x150-1.jpg'; ---- https://www.gdsgdsgsd.cfbx.jp/ この部分を取得する方法がWordPress関数にあると思うので探してみてください。 もしかしたら、これで。 ---- $img = home_url().'/wp-content/uploads/2022/07/14-150x150-1.jpg'; ----

php_learn
質問者

補足

両方実行してみましたが変わりませんでした。 よくわからないことが起こっていまして、画像のURLを変えても削除してもテーブルを削除してもキャッシュを消しても以前の画像のまま表示されてしまいます。 ダミー画像を操作しているのは下記コードのみでしょうか? 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]; $title = "<strong><a href=\"{$item->link}\">{$item->title}</a></strong>"; if (empty($item->img)) { $img = 'wp-content/uploads/2022/06/FIGURE-141392.jpg'; } else { $img = $item->img; } ※該当ファイル https://wandbox.org/permlink/Ulwt1BG67WxLg8lU

すると、全ての回答が全文表示されます。

関連するQ&A