質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
cron

cronは、Unix系OS上でデーモンプロセスとして動作する、スクリプトの自動実行が可能なジョブスケジューラです。

foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

2368閲覧

Wordpress「foreach文の中での加算を繰り返す方法」が分からない

koinuf

総合スコア5

cron

cronは、Unix系OS上でデーモンプロセスとして動作する、スクリプトの自動実行が可能なジョブスケジューラです。

foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

1グッド

1クリップ

投稿2020/03/12 07:00

編集2020/03/12 12:27

前提・実現したいこと

Wordpressにて「投稿ページURLの自動更新」を制作してみたところ、関数による「日時」の呼び出し等の更新は実現出来ましたが、数字をカウントアップさせるための記載が分からず質問させていただきました。

テストの状態では、末尾の数字がカウントアップされない状態で、カウントは「1」のまま。
とうとう行き詰まってしまったので、ご教示いただけないでしょうか。
※結果の確認がしやすいため現在は「1分毎に1を加算」でテストしております。

該当のソースコード

PHP

1function my_add_intervals($schedules) { 2 $schedules['1min'] = array( 3 'interval' => 60, 4 'display' => __('every 1 minute') 5 ); 6 return $schedules; 7} 8add_filter( 'cron_schedules', 'my_add_intervals'); 9 10if ( !wp_next_scheduled( 'update_post_slug_cron' )) { 11 wp_schedule_event( time(), '1min', 'update_post_slug_cron' ); 12} 13 14function update_post_slug() { 15 $args = array( 16 'posts_per_page' => -1, 17 'post_type' => 'post' 18 ); 19 $posts = get_posts($args); 20 foreach ($posts as $post) { 21 if(preg_match('/aaaaa/', $post->post_name)) { 22 date_default_timezone_set('Asia/Tokyo'); 23 24 $countnum = 1; 25 $countplus = $countnum++; 26 27 $base_slug = $post->post_name; 28 if(strpos($base_slug,'_')) { 29 $base_slug = substr($base_slug, 0, strcspn($base_slug, '_')); 30 } 31 $my_post = array( 32 'ID' => $post->ID, 33 'post_name' => $base_slug . '_' . $countplus, 34 ); 35 wp_update_post($my_post); 36 } 37 } 38} 39add_action ('update_post_slug_cron', 'update_post_slug'); 40

PHP

1$countnum = 1; 2$countplus = $countnum++;

この箇所が

PHP

1$my_post = array( 2'ID' => $post->ID, 3'post_name' => $base_slug . '_' . $countplus, 4);

この箇所が毎分「_1」「_2」「_3」と反映されず、結果が「_1」のままなのが、詰まっているポイントです。

試したこと

色々と試してみましたが、foreachで加算させる事に無理があるのでしょうか…

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

s.k👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tabuu

2020/03/12 07:44

post_name(slug)はurlの一部になるので変動させないほうがいいと思いますが、目的は何でしょうか?
koinuf

2020/03/12 08:03

私もそう思います。新着としての定期更新を手動でなく、末尾数字の加算で自動化出来ないか?との内容でした。実験的に1分で加算を試してみたら意外に難しく…。毎日や日時の追加変更は成功したのですが、基礎が分かっていないので、foreach内での加算に詰まってしまいました。
m.ts10806

2020/03/12 09:29

URLパラメータの加算が必要だと考えた論拠を質問本文に記載してください
koinuf

2020/03/12 12:03

かしこまりました。
guest

回答3

0

ベストアンサー

PHP

1 $countnum = 1; 2 foreach ($posts as $post) { 3 if(preg_match('/aaaaa/', $post->post_name)) { 4 date_default_timezone_set('Asia/Tokyo'); 5 6 // $countnum = 1; // foreach で何回まわっても1が代入されることでリセット 7 $countplus = $countnum++; 8 9 $base_slug = $post->post_name; 10 if(strpos($base_slug,'_')) { 11 $base_slug = substr($base_slug, 0, strcspn($base_slug, '_')); 12 } 13 $my_post = array( 14 'ID' => $post->ID, 15 'post_name' => $base_slug . '_' . $countplus, 16 ); 17 wp_update_post($my_post); 18 } 19 }

投稿2020/03/12 12:34

kei344

総合スコア69606

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

koinuf

2020/03/12 13:09

お忙しい中、コメントありがとうございます。 ご教示いただいた方法だと「aaaa」を持つ投稿全てに新着順に番号が振られてしまいました。 https://〇〇〇〇.com/aaaa01_01 https://〇〇〇〇.com/aaaa02_02 https://〇〇〇〇.com/aaaa03_03  ・  ・ 上記の結果です。 どういう訳か、1分後のカウントアップもされません。 達成したい結果としては https://〇〇〇〇.com/aaaa01_01 https://〇〇〇〇.com/aaaa02_01 https://〇〇〇〇.com/aaaa03_01 1分後 https://〇〇〇〇.com/aaaa01_02 https://〇〇〇〇.com/aaaa02_02 https://〇〇〇〇.com/aaaa03_02 なのです。
koinuf

2020/03/12 13:29

例えば、foreach内でも関数で時間の呼び出しをしてみると、期待通りの結果になるので、その辺りにポイントがあるのかと考えていたのですが、さっぱり分かりません。 【例】 date("Hi") なら https://〇〇〇〇.com/aaaa01_2229 https://〇〇〇〇.com/aaaa02_2229 となります。
kei344

2020/03/12 13:59

「foreach文の中での加算を繰り返す方法」を回答したので、 https://〇〇〇〇.com/aaaa01_01 https://〇〇〇〇.com/aaaa02_02 https://〇〇〇〇.com/aaaa03_03 になります。何の不思議も無い。 cron_schedulesに登録しても、毎回別プロセスとして実行されるので、変数は保持されません。何かをカウントしたければ実行するたびその数を保存する必要があります。
koinuf

2020/03/12 14:15

お忙しい中、コメントありがとうございます。 なるほどです。質問が求める結果に結びつかないという事なのですね。 失礼を致しました。 頂戴したヒントが鍵のようですが、ピンとくるだけの知識もなく新たな闇が見えてきました…。
kei344

2020/03/12 14:22

とりあえず「何のために」その仕様にする必要があると考えているかを明確にする必要があると思います。 毎分DBサーバに全記事の書き換えを発行する仕組みというのは仕組みとして普通じゃありません。(質問文に追記することをお勧めします)
guest

0

WordPress標準は投稿日時順に表示されますが、以下のようにすれば更新日時順になります。
post_nameを更新せず、更新日時のみupdateすれば目的は達成できそうですが、あまり効率的ではありませんね。

PHP

1function my_pre_get_posts($query) { 2 $query->set('orderby', 'modified'); 3} 4add_action('pre_get_posts', 'my_pre_get_posts');

投稿2020/03/12 08:35

tabuu

総合スコア2480

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

koinuf

2020/03/12 09:10 編集

ありがとうございます。 あくまで「「1分に1回※、投稿ページのURL末尾が1ずつカウントアップする」」が条件なのです。 ※1分に1回でテストしておりますが、のちのちは1ヶ月に1度です。 URLの日時やカウントアップ以外での自動更新には成功しております。 その過程で「foreach内にカウントアップの計算式をどう書くのだろう?」となってしまいました。 書いてみて、これじゃあ動かないよな…と。 <code> foreach ($posts as $post) { /*省略*/ $weeknum = 1; $weekplus = $weeknum++; /*省略*/ $my_post = array( 'ID' => $post->ID, 'post_name' => $base_slug . '_' . $weekplus, ); wp_update_post($my_post); } } </code>
guest

0

見た感じPHPでやってますがJSでやった方が良いとは思います。
URLのパラメータの加算をしてどうするのでしょうか?
それによってこの先の回答が変わります。

投稿2020/03/12 07:40

kyoya0819

総合スコア10429

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

koinuf

2020/03/12 08:09

ありがとうございます。 新着としての定期更新を手動でなく、末尾数字の加算で自動化出来ないか?との内容でした。 PHPだと、パーマリンクで他の箇所にも変更後のURLを更新出来るので、PHPで考えておりましたが、JSでも同様に変更後のURLを再利用出来るなら試してみたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問