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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

WordPress

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

PHP

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

Q&A

解決済

3回答

7568閲覧

Wordpressでカスタムフィールドを自動保存したい

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

WordPress

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

PHP

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

0グッド

0クリップ

投稿2016/06/20 09:46

編集2016/06/21 03:02

Wordpressで、自動保存時にカスタムフィールドも保存したいです。
以下のソースをfunctions.phpへ入れていますが、通常のタイトルのみしか保存できません。

php

1function action_save_post( $post_id, $post ) { 2 if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) { 3 return $post_id; 4 } elseif ( !empty( $_POST ) ) { 5 $sample_name = get_post_meta( $post_id, 'sample_name', true); 6 update_post_meta( $post_id, 'sample_name', $sample_name ); 7 } 8} 9add_action( 'save_post' , 'action_save_post', 99, 2 );

カスタムフィールドは、advanceCustomFieldで作成しています。
カスタムフィールドのキー名は正しいはずなのですが・・。
ご教授頂きたいです

//======▼追記▼======//

php

1update_post_meta( $post_id, 'sample_name', 'テスト' );

とすると、wp_postmetaテーブルへはテストが入っている様子です。投稿データの取得が間違っているのでしょうか。。
また、保存しようとしているデータを確認した所、以下の様な結果でした。

php

1 // バッファ領域に書き出し 2 ob_start(); 3 var_dump($sample_name); 4 $result =ob_get_contents(); 5 ob_end_clean(); 6 // ファイルをオープンして既存のコンテンツを取得します 7 $file = '/Applications/MAMP/htdocs/mock/sample.txt'; 8 $current = file_get_contents($file); 9 // 結果をファイルに書き出します 10 file_put_contents($file, $result); 11 12 /*======出力結果は、 string(0) "" となる======*/

投稿中のデータの取得はどのように行うか伺いたいです。

//======▼追記▼======//

php

1 // バッファ領域に書き出し 2 ob_start(); 3 var_dump($_REQUEST); 4 var_dump($_POST); 5 $result =ob_get_contents(); 6 ob_end_clean(); 7 $file = '/Applications/MAMP/htdocs/mock/sample.txt'; 8 $current = file_get_contents($file); 9 file_put_contents($file, $result);

こちら実行した所、カスタムフィールドのデータは入っていませんでした。
advanceCustomFieldプラグインのカスタムフィールドは、自動保存できないのでしょうか。。

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

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

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

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

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

guest

回答3

0

/wp-includes/js/autosave.js でオートセーブは実装されていますが、ここで取得している項目にカスタムフィールドが含まれていません。そのため、PHP側でカスタムフィールドの値を受け取ることは出来ません。(送信されていないから)

公式のSupportでも対応できないとの返答があります。

【saving acf properties when WP runs auto save - ACF Support】
https://support.advancedcustomfields.com/forums/topic/saving-acf-properties-when-wp-runs-auto-save-2/

That’s because WordPress doesn’t include custom fields in the autosave process, even when you use the custom fields box shipped in WordPress itself. This makes it impossible to update the custom fields on autosave. I’m sorry for the inconvenience.

オートセーブ機構はサーバ側だけでなくブラウザのストレージ領域にも保存しているため、そちらを拡張することは出来るかもしれません。

投稿2016/06/21 09:35

kei344

総合スコア69583

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

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

0

ベストアンサー

ちょっと試してみましたが、やはりkei344さんの回答の通り厳しいみたいです。

before-autosaveでmetaを追加

javascript

1jQuery(document).on("before-autosave", function(event, data) { 2 data.meta_input = [{comment : "change"}]; 3 return data; 4} );

以下PHP側

wp-admin/includes/misc.php
heartbeat_autosave

wp-admin/includes/post.php
wp_autosave
wp_create_post_autosave

wp-includes/revision.php
_wp_put_post_revision
wp_post_revision_data //想定していない項目が削られる(確認のためmeta_inputを後から追加)

wp-includes/post.php
wp_insert_post
update_post_meta //同じpost_id&キー名の項目が全部同じ値で上書きされる
(完)

###追記前

編集画面を放置してオートセーブを走らせてみたところ、POST内容に
カスタムフィールドの値は含まれていませんでした。

autosave.jsのコードを確認するとbefore-autosaveというフックらしきものがあったので
ちょっと期待してしまいましたが、そもそもカスタムフィールド自体取得してないみたいです。

このへん
https://github.com/WordPress/WordPress/blob/master/wp-includes/js/autosave.js#L31

もしかしたらwindow.autosave.getPostDataを上書きしたらいける...?

投稿2016/06/21 09:45

編集2016/06/21 14:29
nnssn

総合スコア1221

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

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

kei344

2016/06/21 15:34

リビジョンはカスタム投稿タイプのひとつとして個別の post_id がふられる関係上、カスタムフィールドとの紐付けがしにくいということだと思います。 > //想定していない項目が削られる _wp_post_revision_fieldsのフィルタを使えば項目を増やすことは出来そう。 apply_filters( '_wp_post_revision_fields', $fields, $post ); https://developer.wordpress.org/reference/functions/_wp_post_revision_fields/ 上記で増やした項目を捉えるチャンスはwp_insert_postの下記フィルタのみ。$postarr['post_name']に $post[ID]-(autosave|revision-v1 が入っているのでそれでIDがわかるはず。 apply_filters( 'wp_insert_post_empty_content', $maybe_empty, $postarr ) 上記方法でリビジョンにカスタムフィールドを作ることは(多分)可能だと思いますが、リビジョンが消えるときにカスタムフィールドを削除することや、リビジョンからの復元時にカスタムフィールドも復元することなど、結構考えることは多いと思います。 ただ、ACF のスタッフ陣がこれらの回答に辿り着いていないとも思えないので、なにか大きな罠があるかもしれません。
nnssn

2016/06/22 07:06

追加までこぎつけても、その後の管理まで考えると思った以上に大変みたいですね。 確かに、ACFが対応していない事が答えという感はあります。
nnssn

2016/06/23 04:04

教えていただいた_wp_post_revision_fieldsフィルタでmeta_inputが通るように、 before-autosaveフィルタでACFが生成したキーと値を拾うように変更。 テキストボックス、テキストエリア各1の簡素なサンプルでは動作しました。 ・functions.php // リビジョン保存時、追加項目「meta_input」を許容する add_filter('_wp_post_revision_fields', function ($fields) { return $fields + ['meta_input' => 'メタ']; }); // 管理画面のみbefore-autosave.jsをロード add_action('admin_enqueue_scripts', function (){ wp_enqueue_script('before-autosave', get_template_directory_uri().'/js/before-autosave.js', ['jquery'], '', true); }); ・js/before-autosave.js (function($){ $(document).on("before-autosave", function(event, data) { var inputs = $("[id^=acf-field]"); if (! inputs.length) { return data; } var meta = {}; $(inputs).each(function(i, el) { var key = $(el).attr("id").substr(10); var val = $(el).val(); meta[key] = val; }); data.meta_input = meta; return data; }); })(jQuery);
guest

0

どこかの参考サイトのコードをそのまま使用されたのかと思いますが

php

1if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) { 2return $post_id; 3}

の部分で自動保存時に実行されないようにしていますので、この処理を外してあげてみてください。

投稿2016/06/20 10:21

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2016/06/21 01:18

ご回答ありがとうございます。 以下のソースへ変更しましたが、メインタイトルのみしか保存されず、カスタムフィールドが保存されないようです。 if ( !empty( $_POST ) ) { //投稿更新時 $sample_name = get_post_meta( $post_id, 'sample_name', true); $sample_date = get_post_meta( $post_id, 'sample_date', true);; update_post_meta( $post_id, 'sample_name', $sample_name ); update_post_meta( $post_id, 'sample_date', $sample_date ); }
退会済みユーザー

退会済みユーザー

2016/06/21 02:18

get_post_metaで取得できるのは既に保存されてるデータではないでしょうか。 $_REQUEST['sample_name']っぽいので一度確認してみてください。
退会済みユーザー

退会済みユーザー

2016/06/21 03:03

ありがとうございます。 $_REQUEST並びに、$_POSTをvar_dump()しましたが、カスタムフィールドの値は入っていませんでした。 アドバンスカスタムフィールドプラグインでは、自動保存できないのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問