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

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

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

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

PHP

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

2回答

727閲覧

【WordPress】カスタム投稿タイプ内カスタムフィールドに、ユーザー定義関数で生成した乱数を自動入力したいです。

civcxtBjcyknl

総合スコア3

WordPress

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

PHP

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2020/05/26 12:44

大変初歩的な質問で申し訳ございません。
WordPressのfunctions.php内、自作のフィルターフックにおいて、
2、3日以下の課題に取り組んでいますが、全くクリアされないため、
ご質問を失礼いたします。

前提・実現したいこと

①カスタム投稿にて記事を新規投稿時、
②カスタム投稿画面に設置しているカスタムフィールド
(functions.phpへコードを書いて設置したもの)に、
③生成した乱数を自動入力させておく

発生している問題

カスタム投稿の新規投稿画面に進みますが、 カスタムフィールドが空欄のまま、乱数が自動入力されていません。 ※エラーはなく、phpファイルの保存自体は成功し、サイトも正常表示されます。

該当のソースコード

php

1【ソースコード】 2/** 3 * 乱数パスワード生成(カスタムフィールドに) 4 **/ 5add_filter('wp_insert_post_data','SetPwd', 10, 3); 6 7function SetPwd($data, $postarr){ 8 $pass = makeRandPwd($length); 9 if($data["post_type"] === "goods_info"){ 10 $value = get_post_meta( get_the_ID(), 'password', true ); 11 if($value == ""){ 12 update_post_meta($postid, 'password', $pass); 13 } 14 } 15 return $data; 16} 17 18function makeRandPwd($length) { 19 $length = 16; 20 $str = array_merge(range('a', 'z'), range('0', '9'), range('A', 'Z')); 21 $r_str = null; 22 for ($i = 0; $i < $length; $i++) { 23 $r_str .= $str[rand(0, count($str))]; 24 } 25 return $r_str; 26}

試したこと

フィルターフックの設定や、ユーザー定義関数の記述方式など、
書籍(「WordPressユーザーのためのPHP入門」)やWordPress Codexを参照したり、
簡単なコーディングにて、投稿タイプやカスタムフィールドの取得、ユーザー定義関数が
正常に動作することを確認いたしました。

また、上記ソースコードを保存時、エラーメッセージは出ておらず、
サイトも正常に表示されます。

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

  • 使用サーバー : Xserver
  • PHP version : PHP7.3.16
  • WordPress version : WordPress 5.4.1

上記ソースコードに至るまで、何回か新規にコーディングし直したり、
Codexを参照し、関数やフィルターフックの使用方法が適正かどうか、
Web検索でのコーディング紹介サイトの参照、書籍での基本的知識の獲得などに基づき、
正規の記述方式を守ったつもりではございますが、
これ以上は、どこが根本的に誤っているのか、主観的に冷静な精査ができかねます為、
恥を忍んでこちらにご質問させていただきました。

主観と致しましては、

php

1add_filter('wp_insert_post_data','SetPwd', 10, 3); 2 3function SetPwd($data, $postarr){ 4 $pass = makeRandPwd($length); 5 if($data["post_type"] === "goods_info"){ 6 $value = get_post_meta( get_the_ID(), 'password', true ); 7 if($value == ""){ 8 update_post_meta($postid, 'password', $pass); 9 } 10 } 11 return $data; 12}

こちらの関数の記述内容において、

  • $data["post_type"]の記述ミスでカスタム投稿タイプが指定できていない
  • 'wp_insert_post_data'のフィルターフックが記述ミスで掛かっていない
  • add_filterでの、渡す変数の個数が間違っている
  • そもそも変数の記述が間違っている

などの誤りがあるのではないかと考えておりますが、どこがどう間違っているのか、
見当がつきかねる状況です。

第三者の方の視点から、どの箇所に誤りがあるのかご指摘いただけますと幸いです。
お手数ではございますが、以上、何卒宜しくお願いいたします。

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

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

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

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

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

guest

回答2

0

結果、以下のコーディングにて解決することができました。

php

1/** 2 * 乱数パスワード生成(カスタムフィールドに) 3 **/ 4function makeRandPwd($length) { 5 $length = 16; 6 $str = array_merge(range('a', 'z'), range('0', '9'), range('A', 'Z')); 7 $r_str = null; 8 for ($i = 0; $i < $length; $i++) { 9 $r_str .= $str[rand(0, count($str))]; 10 } 11 return $r_str; 12} 13 14function SetPwd($post_ID, $post, $update){ 15 $pass = makeRandPwd($legth); 16 $post_type = get_post_type( $post_ID ); 17 if ( "goods_info" != $post_type ) 18 return; 19 if ( isset( $pass ) ) { 20 update_post_meta( $post_ID, 'password', sanitize_text_field( $pass ) ); 21 } 22} 23add_action('save_post','SetPwd', 10, 3 );

この度貴重なアドバイスをいただきました、kei344様、誠にありがとうございました。
もっと精進してまいりたいと思います。

投稿2020/05/27 16:42

civcxtBjcyknl

総合スコア3

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

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

0

ベストアンサー

wp_insert_postで試してみてはいかがでしょう。

【カスタムフィールドの自動更新 | ハックノート】
https://hacknote.jp/archives/19693/

例えばwp_insert_post_data内ではupdate_post_metaは使えません。

【post.php in tags/5.4/src/wp-includes – WordPress Trac】
https://core.trac.wordpress.org/browser/tags/5.4/src/wp-includes/post.php#L4155

投稿2020/05/26 12:54

kei344

総合スコア69606

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

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

civcxtBjcyknl

2020/05/26 13:06 編集

kei344様 早速のご回答をいただき、ありがとうございます。 wp_insert_post_meta内でメタデータを更新することができない旨、存じ上げませんでした。ありがとうございます。 ご提示いただいたリンク先の情報も踏まえ、wp_insert_postにて、 コーディングを試してみたいと思います。 ありがとうございます。
civcxtBjcyknl

2020/05/27 16:37

この度はお世話になっております。 その後いろいろ調べ、結果フックを「save_post」にて解決でき、 新規投稿時にカスタムフィールド へ乱数を自動入力することができました。 この度は貴重なご意見を頂戴し、また大変お世話になりました事、誠にありがとうございます。 今後ももっとコーディングの知識を深めてまいります。
civcxtBjcyknl

2020/05/27 16:56

よく確認してみたところ、おっしゃる通りでした。 修正前の「function SetPwd」に根本原因がありました。 いろいろ調べていて、最後にたどり着いたのが「save_post」でしたが、 wp_insert_postと働きは同じところを冷静に判断できておりませんでした。 ご指摘いただき、ありがとうございます。
kei344

2020/05/27 16:58

To: civcxtBjcyknlさん コメントが入れ違いましたが、状況把握しました。
civcxtBjcyknl

2020/05/27 17:04

ありがとうございます。 wp_insert_postにコーディングし直しました。 まだ改良点はあるものの、ご指摘いただきました内容を基に、 まず現段階での課題はクリアできました。 誠にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問