これがすでにここで回答されている場合は申し訳ありません。私は周りを見回しましたが、私の質問に対する答えが見当たらなかったので、自分で投稿したいと思いました。
私は、完成した最近のプロジェクトに関する顧客からのフィードバックを集めるクライアント用のプラグインを作成しています。
管理者はシステムを使用して顧客に「プロンプト」を送信し、サイト上のフォームへのリンクを付けてフィードバックを求めます。
「customer_prompts」というカスタム投稿タイプを作成しました。これには、タイトルフィールドと、カスタムデータベーステーブルに格納され、投稿メタではないカスタムフィールドがいくつかあります。
以下は私のsave_postアクションのコードです。パブリッシュをヒットしても、save_postアクションは起動されず、title値がwp_postsに保存されるだけです。
add_action('save_post', 'save_Prompt');
function save_Prompt($post_id){
$post = get_post($post_id);
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return;
if ( 'customer_Prompt' == $_POST['post_type'] )
{
if ( !current_user_can( 'edit_page', $post_id ) )
return;
}
else
{
if ( !current_user_can( 'edit_post', $post_id ) )
return;
}
global $wpdb;
$Prompt_id = com_create_guid();
$customer_feedback_name = $_POST['_sdg_customer_feedback_name'];
$customer_feedback_email = $_POST['_sdg_customer_feedback_email'];
$salesperson = $_POST['_sdg_salesperson'];
$values = array(
'id' => $Prompt_id,
'sdg_customer_name' => $customer_feedback_name,
'sdg_customer_email' => $customer_feedback_email,
'sdg_salesperson' => $salesperson,
'sdg_post_id' => $post->id
);
$insert = $wpdb->insert($table_name, $values);
if($insert) {
mail($customer_feedback_email, 'hello', 'hello');
}
}
私はここで何が起こっているのかわからないので、どんな助けでも大いに感謝されるでしょう。
ありがとう、ジェイミー。
"save_post"アクションはポストページフォームで実際に何かを変更したときにのみ呼び出されます。何も変更せずに更新ボタンを押すだけでは、 "save_post"アクションは呼び出されません。
カスタムメタボックスがあるカスタム投稿タイプを編集している場合、これは重要です。 "save_post"アクションに頼り、カスタムメタボックスの内容だけを変更しても、何も起こりません。
解決策は、 "save_post"の代わりに "pre_post_update"アクションフックを使うことです。
http://wordpress.org/support/topic/save_post-not-working-getting-called#post-2335557
edit print_r('hello world'); die();
の後にfunction save_Prompt($post_id){
を配置して、実際にその関数が実際にアクションフックによって認識されるようにしましたか。 /編集
いくつかの問題が関係している可能性があります。
1:あなたのglobal wpdb
は、あなたのif条件文の前に、あなたの関数の一番上にある必要があります。
2:あなたの$_POST
変数はあなたの関数に到達する前にポストされたデータが実際にセットされているかどうかチェックするためにif(isset($_POST['food'))
の条件式を持たなければなりません。
3:関数の先頭でglobal $post
を試すと、$post->post_type
などの投稿の変数を$post
変数を介してオブジェクトとして呼び出すことができます。
4:DBクエリが正しくない場合は、$wpdb->print_errors; die();
の後に$insert = $wpdb->insert($table_name, $values);
を追加します。
うまくいけば、それらのうちの1つがあなたの問題を解決するはずです。
私はadd_action( 'save_post'のvar_dump、コールバック関数が表示されていないと思います!
追加する
$fp = fopen('c:\data.txt', 'w');
fwrite($fp, print_r($post_id, true));
fclose($fp);
そして 'data.txt'が存在するかどうか確認してください、そうです、それはsave_postによって本当です。
:)
これは私に起こりました。テーマを切り替えた後に、私はページテンプレート(_wp_page_template
のポストメタ値)をもう存在しないテンプレートに設定しました。 wp-includes/post.php
のコードのこの部分:
if ( ! empty( $postarr['page_template'] ) ) {
$post->page_template = $postarr['page_template'];
$page_templates = wp_get_theme()->get_page_templates( $post );
if ( 'default' != $postarr['page_template'] && ! isset( $page_templates[ $postarr['page_template'] ] ) ) {
if ( $wp_error ) {
return new WP_Error( 'invalid_page_template', __( 'Invalid page template.' ) );
}
...
save_post
を起動する前に中止します。
私もこの正確な問題を抱えていて、誰かが時間を節約するのを助けるために、私は可能性のある答えに加えたいと思いました。それを特定するのに何日もかかった非常に単純な問題でした(私は現時点では私はちょっとばかげています - そして少しばかげた感じがします).
生成されていたメタボックスフォームには、WordPress生成フォームの "action"フィールドを上書きしていた "action"フィールドが含まれていたことがわかりました。フォームはカスタム投稿でのみ使用されていたPOSTのWordPressを ' wp-admin/post.php 'にすると、デフォルトのハンドラ(switch文の最後)で処理されてしまいました。
もう一つの副作用は、更新または公開時に、WordPressが編集された投稿に戻るのではなく、組み込みの投稿インデックスにリダイレクトされることでした。
解決策はメタボックスの 'action'隠しフォーム要素を削除することでした。
これが誰かに役立つことを願っています...
最初に、私はあなたのWordPressサイトをデバッグしやすいように設定することをお勧めします http://codex.wordpress.org/Debugging_in_WordPress
そうすることで、簡単にstuff;を参照)
アクションフックの場合は、次のようにフックする必要があると思います。
add_action('save_post', 'save_Prompt', 10, 2);
function save_Prompt( $post_id, $post ){
//do whatever
}
save_post
フックは2つの引数を渡します。