Last active
May 8, 2020 13:14
-
-
Save mt8/643bdce131841a73e450aa0407a30c9b to your computer and use it in GitHub Desktop.
[WordPress Plugin] MW WP Formから送信されたデータを投稿に複製する
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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