Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@mt8
Last active May 8, 2020 13:14
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mt8/643bdce131841a73e450aa0407a30c9b to your computer and use it in GitHub Desktop.
Save mt8/643bdce131841a73e450aa0407a30c9b to your computer and use it in GitHub Desktop.
[WordPress Plugin] MW WP Formから送信されたデータを投稿に複製する
<?php
/**
* Plugin Name: MW WP Form Data 2 Post
* Description: MW WP Formから送信されたデータを投稿に複製する
* Author: mt8
* Version: 1.0
* License: GPL2
* MW WP Form Data 2 Post is free software: you can redistribute it and/or modify
*/
class MW_WP_Form_Data_2_Post {
//MW WP Formのキー
const MW_WP_FORM_KEY = 'mwf_XX';
//作成する投稿タイプ
const POST_TYPE = 'post';
//作成する投稿のステータス
const POST_STATUS = 'draft';
//作成する投稿の作成者(ID)
const POST_AUTHOR = 1;
//作成する投稿の本文
//(本文をセットしない場合は空にする)
const POST_CONTENT =
'
{{message}}
{{img1}}
{{img2}}
{{img3}}
';
//MW WP Formの項目が一致する場合に処理する
//(「問い合わせ種別」 type1の場合に処理するイメージ)
//(不要な場合はarray()でOK)
const MW_CONDITIONS = array(
'contact_type' => 'type1',
);
//MW WP Formの項目とPostオブジェクトのペア
//(フォーム項目を直接WP_Postオブジェクトにセットする場合に使用)
//(不要な場合はarray()でOK)
const MW_POST = array(
'title' => 'post_title',
);
//MW WP Formとタクソノミーのペア
//(不要な場合はarray()でOK)
const MW_TAX = array(
'category' => 'category',
);
//MW WP Form内の画像フィールド
//(不要な場合はarray()でOK)
const MW_IMG = array(
'img1',
'img2',
'img3',
);
//MW WP Formの項目名とカスタムフィールドキーのペア
//(CF側をemptyにするとCFにセットしません)
//(CFとして保存しないキーも列挙することでpost_contentに展開可能になる)
//(不要な場合はarray()でOK)
const MW_CF = array(
'address' => 'cf_address',
'tel' => 'cf_tel',
'email' => '',
'message' => '',
);
public function register_hooks() {
add_action( 'publish_' . self::MW_WP_FORM_KEY, array( $this, 'publish_mw_form_data' ), 10, 2 );
add_action( "add_post_meta", array( $this, 'add_post_meta' ), 10, 3 );
}
/**
* MW WP Formで問い合わせデータが作成されたときの処理
*/
public function publish_mw_form_data( $mw_wp_form_data_id, $mw_wp_form_data_object ) {
//条件チェック
if ( ! $this->check_conditions() ) {
return;
}
//コピーする投稿パラメータ作成
$new_post_args = array();
$new_post_args['post_type'] = self::POST_TYPE; //投稿タイプ
$new_post_args['post_status'] = self::POST_STATUS; //投稿ステータス
$new_post_args['post_author'] = self::POST_AUTHOR; //作成者
$new_post_args['post_content'] = self::POST_CONTENT; //本文
//本文には任意のフィールドが{キー}をして設定されるので置換する
//投稿オプジェクト
foreach ( self::MW_POST as $mw_key => $val ) {
if ( isset( $_POST[ $mw_key ] ) && ! empty( $_POST[ $mw_key ] ) ) {
$value = $this->mw_wp_form_choise_item_to_string( $_POST[ $mw_key ] );
$new_post_args['post_content'] = str_replace( '{{'.$mw_key.'}}', $value, $new_post_args['post_content'] );
}
}
//カスタムフィールド
foreach ( self::MW_CF as $mw_key => $cf_key ) {
if ( isset( $_POST[ $mw_key ] ) && ! empty( $_POST[ $mw_key ] ) ) {
$value = $this->mw_wp_form_choise_item_to_string( $_POST[ $mw_key ] );
$new_post_args['post_content'] = str_replace( '{{'.$mw_key.'}}', $value, $new_post_args['post_content'] );
}
}
//タクソノミー
foreach ( self::MW_TAX as $mw_key => $tax_name ) {
if ( isset( $_POST[ $mw_key ] ) && ! empty( $_POST[ $mw_key ] ) ) {
$value = $this->mw_wp_form_choise_item_to_string( $_POST[ $mw_key ] );
$new_post_args['post_content'] = str_replace( '{{'.$mw_key.'}}', $value, $new_post_args['post_content'] );
}
}
//フォームの内容をPostオブジェクトに設定する
foreach ( self::MW_POST as $mw_key => $post_object_key ) {
if ( isset( $_POST[ $mw_key ] ) && ! empty( $_POST[ $mw_key ] ) ) {
$value = $this->mw_wp_form_choise_item_to_string( $_POST[ $mw_key ] );
$new_post_args[ $post_object_key ] = $value;
}
}
//コピー投稿作成
$new_post_id = wp_insert_post( $new_post_args, true );
if ( $new_post_id > 0 ) {
//MW WP Formデータに作成した投稿IDをセットしておく
update_post_meta( $mw_wp_form_data_id, '_MW_WP_Form_Data_2_Post', $new_post_id );
//カスタムフィールドをコピー
foreach ( self::MW_CF as $mw_key => $cf_key ) {
if ( '' == $cf_key ) {
continue;
}
if ( isset( $_POST[ $mw_key ] ) && ! empty( $_POST[ $mw_key ] ) ) {
$value = $this->mw_wp_form_choise_item_to_string( $_POST[ $mw_key ] );
update_post_meta( $new_post_id, $cf_key, $value );
}
}
//タクソノミーを設定
foreach ( self::MW_TAX as $mw_key => $tax_name ) {
if ( isset( $_POST[ $mw_key ] ) && ! empty( $_POST[ $mw_key ] ) ) {
$value = $this->mw_wp_form_choise_item_to_string( $_POST[ $mw_key ] );
$terms = explode( ',', $value );
foreach( $terms as $term_name ) {
$term_obj = get_term_by( 'name', $term_name, $tax_name );
if ( $term_obj instanceof WP_Term ) {
$ret = wp_add_object_terms( $new_post_id, $term_obj->term_id, $tax_name );
}
}
}
}
}
}
/**
* MW WP Formの問い合わせデータの添付ファイルのメタが更新されたときの処理
*/
public function add_post_meta( $object_id, $meta_key, $_meta_value ) {
//条件チェック
if ( ! $this->check_conditions() ) {
return;
}
//MW WP Formデータの投稿タイプのみ処理
if ( self::MW_WP_FORM_KEY != get_post_type( $object_id ) ) {
return;
}
//対象の画像キーのみ処理
if ( ! in_array( $meta_key, self::MW_IMG ) ) {
return;
}
//MW WP Formデータからコピーした投稿IDを取得
$copy_post_id = get_post_meta( $object_id, '_MW_WP_Form_Data_2_Post', true );
$copy_post = get_post( $copy_post_id );
if ( $copy_post instanceof WP_Post ) {
//投稿本文内の{{画像キー}}を置換する
$post_content = $copy_post->post_content;
$post_content_original = $post_content;
$post_content_mod = false;
$attachment_id = (int)$_meta_value;
if ( $attachment_id > 0 ) {
//添付ファイルのタイトルに{post_title}を付与する
$attachment_title = get_the_title( $attachment_id );
if ( $meta_key == $attachment_title ) {
$attachment_title = $copy_post->post_title . '-' . $attachment_title;
wp_update_post(
array(
'ID' => $attachment_id,
'post_title' => $attachment_title,
)
);
}
$post_content = str_replace(
'{{'.$meta_key.'}}',
wp_get_attachment_image( $attachment_id ),
$post_content
);
if ( $post_content != $post_content_original ) {
$post_content_mod = true;
}
}
//置換した場合
if ( $post_content_mod ) {
//投稿を更新する
wp_update_post(
array(
'ID' => $copy_post_id,
'post_content' => $post_content,
)
);
}
}
}
/**
* MW WP Formで送信された項目がチェック項目を満たしているか判定
*/
private function check_conditions() {
//チェック項目なし
if ( empty( self::MW_CONDITIONS ) ) {
return true;
}
//チェック項目すべてOKの場合のみOKとする
$condition_check = false;
foreach ( self::MW_CONDITIONS as $mw_key => $condition_value ) {
if ( isset( $_POST[ $mw_key ] ) && ! empty( $_POST[ $mw_key ] ) ) {
$post_value = $this->mw_wp_form_choise_item_to_string( $_POST[ $mw_key ] );
if ( $post_value == $condition_value ) {
$condition_check = true;
} else {
//1つでも異なる場合はNG
return false;
}
}
}
return $condition_check;
}
/**
* MW WP Formの選択項目(select,checkbox,radio)を文字列として返す
*/
private function mw_wp_form_choise_item_to_string( $value ) {
if ( is_array( $value ) && array_key_exists( 'data', $value ) ) {
$value = $value['data'];
}
return $value;
}
}
$MW_WP_Form_Data_2_Post = new MW_WP_Form_Data_2_Post();
$MW_WP_Form_Data_2_Post->register_hooks();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment