• ベストアンサー
※ 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.54

・consoleでjQueryの読み込みエラーをチェックして読み込んでいるはずなのですが何も表示されていません… どのページのどの処理のことでしょうか。 コードをいただけますか。

php_learn
質問者

補足

下記カードになります。consoleでは読み込みエラーは起きてませんが、 デロッパツールで確認すると</head>前に読み込まれていないので、疑問ですが… アーカイブの5月ボタンをクリックすると以下のリンクに飛ばされているため、SQL側で機能していない可能性も考えられるのですが… 原因の特定が出来ておりません…http://www.gdsgdsgsd.cfbx.jp/2022/5/ functions.php //jQuery読み込み function my_scripts() { wp_enqueue_script( 'slider', get_template_directory_uri().'themes/sample_theme/js/archive.js', array('jquery'), '1.0' ); } add_action( 'wp_enqueue_scripts', 'my_scripts' ); ※archive.js <script> jQuery( document ).ready( function( $ ) { // @link: http://www.gdsgdsgsd.cfbx.jp/ //年月別アーカイブ表示用 $(".archive-list &gt; li").click(function() { //@link: http://www.gdsgdsgsd.cfbx.jp/ if($(this).next(".month-archive-list").is(":visible") || $(this).hasClass("acv_open")){ //既に開いている場所なら $(".month-archive-list", this).slideUp("fast"); //閉じる $(this).removeClass("acv_open"); //.acv_open削除 } else { //閉じている場所なら $(this).siblings().children(".month-archive-list").slideUp("fast"); //その他のリストを閉じる $(".month-archive-list", this).slideDown("fast"); //開く $(".year").removeClass("acv_open"); //.acv_open削除 $(this).addClass("acv_open"); //.acv_open付加 } }); }); </script>

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

【アーカイブ その6】 それですと、こんな感じで大丈夫そうです。 ---- /* 検索全件件数取得 */ $mm = str_pad($m, 2, '0', STR_PAD_LEFT); $date_query = "{$y}-{$mm}%"; (省略) $query = $wpdb->prepare($sql, $date_query, $date_query); ---- LIKEのための%は日付の部分だけでいいので後ろにひとつを先に付けておけば、prepare()に渡す時にはそのままでよくなります。

php_learn
質問者

お礼

archive.phpのSQLについて質問があるのですが、下記の記述の意味が分かりませんでした。 これは何をされているのでしょうか? $mm = str_pad($m, 2, '0', STR_PAD_LEFT);str_pad 対象文字列に対して、特定の文字でパディング(埋める)を行います。 $date_query = "{$y}-{$mm}%"; ※該当コード /* 検索全件件数取得 */ $mm = str_pad($m, 2, '0', STR_PAD_LEFT);str_pad 対象文字列に対して、特定の文字でパディング(埋める)を行います。 $date_query = "{$y}-{$mm}%"; $sql = " SELECT COUNT(*) AS count FROM wp_posts AS post INNER JOIN wp_postmeta AS meta ON post.ID = meta.post_id WHERE meta.meta_key = 'single_rss_feed1' AND post.post_type = 'post' AND post.post_status = 'publish' AND (post.post_date LIKE %s OR post.post_modified LIKE %s ) "; $query = $wpdb->prepare($sql, $date_query, $date_query); $results = $wpdb->get_results($query); $pages = ceil($results[0]->count / $posts_per_page);

php_learn
質問者

補足

回答ありがとうございます。 consoleでjQueryの読み込みエラーをチェックして読み込んでいるはずなのですが何も表示されていません…

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

【アーカイブ その5】 訂正コードです。 ----誤 $y = get_the_date('Y'); $m = get_the_date('n'); ---- ここは削除してください。 phpファイルの先頭に以下のコードを追加してください。 get_header()の行より前です。 ----訂正 <?php $y = get_query_var('year'); $m = get_query_var('monthnum'); ?> ----

php_learn
質問者

補足

修正ありがとうございます。 1点気になることがあるのですが、$yと$mをまとめて$ymなどにして それを$date_query = $ymのように渡すことでSQLで記事検索はできないのでしょうか… Javascriptを作る際に、%Sに値を配列($)を直接渡して強引に検索させるというアドバイスも出たのですが、どうでしょうか? AND (post.post_date LIKE %s OR post.post_modified LIKE %s )

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

先ほどのコードに誤りがありました。 後ほど訂正コードを投稿します。

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

【アーカイブ その4】 アーカイブページにも他のページ同様にRSSなどを表示されるのですよね。 get_posts()のパラメータに年月を指定できるようです。 ---- // 投稿読み込み $posts_per_group = 1; // 投稿グループあたり投稿件数 $posts_per_page = $block_per_page * $group_per_block * $posts_per_group; // ページあたり投稿件数 $posts_offset = ($current_page - 1) * $posts_per_page; // 投稿オフセット $y = get_the_date('Y'); $m = get_the_date('n'); $args = [ 'posts_per_page' => $posts_per_page, 'offset' => $posts_offset, 'meta_key' => 'single_rss_feed1', 'year' => $y, 'monthnum' => $m, ]; $post_items = get_posts($args); // 表示 ----

php_learn
質問者

補足

修正ありがとうございます。表示する予定です。

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

【アーカイブ その3】 先ほどのコードに誤りがあったので訂正します。 ----誤 GROUP BY post.post_date ----訂正 GROUP BY y, m ---- アーカイブページについては調査中です。

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

【アーカイブ その2】 まず、アーカイブリストの表示ですが、画像1(front-page.php)、画像2(page-secound.php)、画像3(page-third.php)では、それぞれの画像数のアーカイブを表示したい、と言うことですよね。 wp_get_archives()では$argsにカスタムフィールドを指定できないため、SQLでデータを取得します。 元の処理に近いものにしようと思ったのですが、無駄なループがあったため、私なりに作り直しました。 以下のコードは画像1用ですので、meta.meta_key = 'single_rss_feed1'のところを画像2、画像3ではそれぞれのキーにしてください。 ---- <?php /* 年月別アーカイブリストを取得する */ $sql = " SELECT YEAR (post.post_date) AS y, MONTH (post.post_date) AS m, count(*) AS c FROM wp_posts AS post INNER JOIN wp_postmeta AS meta ON post.id = meta.post_id WHERE meta.meta_key = 'single_rss_feed1' AND post.post_type = 'post' AND post.post_status = 'publish' GROUP BY post.post_date ORDER BY y, m "; $query = $wpdb->prepare($sql); $ym_items = $wpdb->get_results($query); /* 年月別配列を作成 */ $ym_array = []; foreach ($ym_items as $item) { $ym_array[$item->y][$item->m] = $item->c; } $this_year = (string) idate('Y'); // 現在の年を、4桁の文字列で取得 $out = '<ul class="archive-list">'; foreach ($ym_array as $y => $y_items) { if ($y === $this_year) { // 今年だったら $out .= '<li class="year acv_open current">'.$y; } else { // それ以外の年の場合 $out .= '<li class="year">'.$y; } $out .= '<ul class="month-archive-list">'; foreach ($y_items as $m => $c) { $url = home_url("{$y}/{$m}"); $out .= "<li><a href=\"{$url}\">{$y}年{$m}月</a>({$c})</li>"; } $out .= '</ul>'; // 閉じる <ul class="month-archive-list"> } $out .= '</li>'; // 閉じる <li class="year"> $out .= '</ul>'; // 閉じる <ul class="archive-list"> // HTMLの出力 echo $out; ?> ----

php_learn
質問者

補足

修正ありがとうございます。SQLに値が渡せていないのか、下記のように表示されております。表示されているものが何を意味しているのか分からないのですが、jQueryの読み込みに失敗しているのでしょうか? https://imgur.com/a/t8dQAW1.jpg

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

次の行末の '; が抜けています。 ---- $subject = '<a href="' . $item->link . '">' . mb_substr($item->subject, 0, 10) . '</a>'; ----

php_learn
質問者

補足

ありがとうございます。解決いたしました。 アーカイブについて質問が2点あるのですが、front-page.phpに設置している年月プルダウンPHPとarchive.phpのSQLを連結させたいのですがどうすればよいでしょうか? これを画像1,画像2,画像3で分けたい場合$argsで制限可能でしょうか? $date_query = $pos;としたのですが上手くいきませんでした。 ※該当コード https://wandbox.org/permlink/TWt0aMILwOZlhQwu ※参考サイト https://cosybench.com/customize-wp-archives-look/

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

いただいたコードにはエラーになっている関数が見当たりません。 エラー行はその行になっていますか。

php_learn
質問者

お礼

\ バックスラッシュが抜けていることが原因だと思うのですが、どのように修正すればよいでしょうか? $subject = '<a href="' . $item->link . '">' . mb_substr($item->subject, 0, 10) . '</a> 以降の文が赤で表示されており認識されていないようです。 ※該当箇所 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 = 'http://www.gdsgdsgsd.cfbx.jp/wp-content/uploads/2022/07/1-19.jpg'; } else { $img = $item->img; } $image = "<a href=\"{$item->link}\"><img src=\"{$img}\" width=\"100\"></a>"; $subject = '<a href="' . $item->link . '">' . mb_substr($item->subject, 0, 10) . '</a> if ($j < $limitSect1) { $contentA .= "<li class=\"sitelink\">{$title}</li>"; // タイトルのみ } elseif ($j < $limitSect1 + $limitSect2) { $contentB .= "<li class=\"sitelink2\"><figure class=\"snip\"><figcaption>{$image}<br>{$title}<p class=\"btn\">{$subject}</p></figcaption></figure></li>"; // 画像と画像の下にタイトル } else { $contentC .= "<li class=\"sitelink3\">{$image}{$title}</li>"; // 画像と画像の右にタイトル } } echo '<div class="rssBlock">'; echo "<ul class=\"wiget-rss\">{$contentA}</ul>"; echo "<ul class=\"wiget-rss\">{$contentB}</ul>"; echo "<ul class=\"wiget-rss\">{$contentC}</ul>"; echo '</div>';

php_learn
質問者

補足

回答ありがとうございます。下記のように修正してみたところ、syntax error, unexpected 'class' (T_CLASS)と表示されています。 ※修正コード $subject = '<a href="' . $item->link . '">' . mb_substr($item->subject, 0, 10) . '</a> ※該当箇所 echo '<div class="rssBlock">'; echo "<ul class=\"wiget-rss\">{$contentA}</ul>"; echo "<ul class=\"wiget-rss\">{$contentB}</ul>"; echo "<ul class=\"wiget-rss\">{$contentC}</ul>"; echo '</div>';

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

mb_strlen()を、mb_substr()にしてみてください。

php_learn
質問者

補足

回答ありがとうございます。 下記のように変更してみたのですが、どうしてもエラーが表示されてしまいます。$subjectをechoの方で字数制限することは可能でしょうか? //エラー文 syntax error, unexpected ' ' (T_STRING) mb_substr(strip_tags($item->subject), 0, 10); ※該当ファイル https://wandbox.org/permlink/HhaUnrwwbDFhYQX4

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

関連するQ&A