サイドスリーブログ

「MW WP Form」で送信されたデータをカスタム投稿に自動追加する方法


                「MW WP Form」で送信されたデータをカスタム投稿に自動追加する方法

「MW WP Form」は、色々カスタマイズできるので、とっても重宝しておりますが、今回は初めてカスタマイズ出来ない。。場面に直面したのでそれをご紹介します。
まず、「MW WP Form」は、お問い合わせデータをデータベースに保存することが可能で、その一覧を出すことができます。
お問い合わせデータをCSVに出力することも可能です。

今回、クライアント様からの要望で、「申し込みデータ内容が間違っている場合があり、CSVをエクスポートして毎回修正するのが大変なので、一覧の申し込みデータを修正したい」とのご要望がありました。
なので、早速フックがあるか調べてみましたが、、、
ない!全然ないっ!
色々調べてみると、わざと修正出来ないようにしているそうです。

これは困った。。。ということで、代替案を探していると、「MW WP Formの問い合わせデータを元に新規でカスタム投稿を作成」というトピックスを発見!
これを活用して、データを修正可能にしてみました。

※以下手順は、「MW WP Form」でフォームを作成していることが前提となります。

MW WP Form でできること、できないこと、やりたいこと

カスタム投稿を作成

Wordpress カスタム投稿を作成 function.php

function.phpにカスタム投稿を追加する記述をします。

php

/*カスタム投稿追加*/
function create_post_type() {
  $datalist = [  // datalist のパラメータを設定する配列
    'title',  // 記事タイトル
    'revisions'  // リビジョン
  ];
  register_post_type( 'datalist',  // カスタム投稿名
    array(
      'label' => 'お問い合わせデータ一覧',  // 管理画面の左メニューに表示されるテキスト
      'public' => true,  // 投稿タイプをパブリックにするか否か
      'has_archive' => false,  // アーカイブを有効にするか否か
      'menu_position' => 5,  // 管理画面上でどこに配置するか今回の場合は「投稿」の下に配置
    )
  );
}
add_action( 'init', 'create_post_type' );

カスタムフィールドを追加

カスタムフィールドを追加 Wordpress

function.phpに記述するパターンもありますが、今回は、「Advanced Custom Filed」のプラグインを使います。

お問い合わせデータの項目と同じ項目を追加していきます。

後でややこしくなりそうなので、この時、フィールド名(英字)は、「MW WP Form」に使用しているnameとは異なる名前に設定しました。

お問い合わせがあれば、作成したカスタム投稿にもデータを追加する

「MW WP Form」のお問い合わせデータがデータベースに登録されたらそのコピーデータを新しくカスタム投稿に保存

考え方としては、「MW WP Form」のお問い合わせデータがデータベースに登録されたらそのコピーデータを新しくカスタム投稿に保存するという感じです。

php


function save_datalist_posts() {
$new_post = array(
	'post_type'   => 'datalist',//コピー登録するカスタム投稿
	'post_status' => 'private',//公開ステータス(ここは個人情報なので非公開に)
	'post_title'  => $_POST['shop_name'],//タイトルは分かりやすいものに。ここでは、ショップ名にしました。
	'post_author' => 1
);
$post_id = wp_insert_post( $new_post, true );
update_post_meta( $post_id, 'list_shop_name', $_POST['shop_name'] );
update_post_meta( $post_id, 'list_shop_kana', $_POST['shop_kana'] );
update_post_meta( $post_id, 'list_name', $_POST['name'] );
update_post_meta( $post_id, 'list_name_kana', $_POST['name_kana'] );
update_post_meta( $post_id, 'list_tantou', $_POST['tantou'] );
update_post_meta( $post_id, 'list_tantou_kana', $_POST['tantou_kana'] );
update_post_meta( $post_id, 'list_kind_name', $_POST['kind_name'] );
update_post_meta( $post_id, 'list_zipcode', $_POST['zipcode'] );
update_post_meta( $post_id, 'list_address1', $_POST['address1'] );
}
add_filter( 'mwform_before_send_admin_mail_mw-wp-form-8', 'save_datalist_posts' );

update_post_meta( $post_id, 'カスタムフィールド名(英字)', $_POST['MW WP Formのname'] );

カスタム投稿の一覧に項目を表示させる

一覧に項目を表示させて使いやすくしていきます。

一覧に項目を表示させて使いやすくしていきます。

php


 function add_posts_columns( $columns ) {
  $columns['list_shop_kana'] = 'ショップ名 フリガナ';//追加したい項目
  $columns['list_name'] = '代表者氏名';
  $columns['list_name_kana'] = '代表者氏名 フリガナ';
  $columns['list_kind_name'] = '業種名';
  $columns['list_zipcode'] = '郵便番号';
  $columns['list_address1'] = '住所';
  return $columns;
}
add_filter( 'manage_edit-datalist_columns', 'add_posts_columns' );

//追加したい項目のデータをひっぱってくる
function custom_posts_column( $column_name, $post_id ) {
  if ( $column_name == 'list_shop_kana' ) {
    $list_shop_kana = get_post_meta( $post_id , 'list_shop_kana' , true );
    echo ( $list_shop_kana ) ? $list_shop_kana : '-';//list_shop_kana(ショップ名 フリガナ)のデータ挿入し無ければ、「-」を表示
  }
  if ( $column_name == 'list_name' ) {
    $list_name= get_post_meta( $post_id , 'list_name' , true );
    echo ( $list_name ) ? $list_name : '-';
  }
  if ( $column_name == 'list_name_kana' ) {
    $list_name_kana = get_post_meta( $post_id , 'list_name_kana' , true );
    echo ( $list_name_kana ) ? $list_name_kana : '-';
  }
  if ( $column_name == 'list_kind_code' ) {
    $list_kind_code = get_post_meta( $post_id , 'list_kind_code' , true );
    echo ( $list_kind_code ) ? $list_kind_code : '-';
  }
  if ( $column_name == 'list_kind_name' ) {
    $list_kind_name = get_post_meta( $post_id , 'list_kind_name' , true );
    echo ( $list_kind_name ) ? $list_kind_name : '-';
  }
  if ( $column_name == 'list_zipcode' ) {
    $list_zipcode = get_post_meta( $post_id , 'list_zipcode' , true );
    echo ( $list_zipcode ) ? $list_zipcode : '-';
  }
  if ( $column_name == 'list_address1' ) {
    $list_address1 = get_post_meta( $post_id , 'list_address1' , true );
    echo ( $list_address1 ) ? $list_address1 : '-';
  }
}
add_action( 'manage_posts_custom_column', 'custom_posts_column', 10, 2 );


補足情報

今回の案件で利用したサーバでは、PHP側のメモリ上限(memory_limit)が80MBとなっており、この一覧表示件数を700件に設定していたら、Out of memory が起きたので、項目数が多い場合は、memory_limitの上限を引き上げるか、表示件数を抑えるようにしたほうが良さそうです。

また、カスタム投稿を作成する前のお問い合わせデータは、インポートでカスタム投稿に登録しました。

カスタム投稿の一覧に追加した項目を含めて検索が出来るようにする

カスタム投稿の一覧に追加した項目を含めて検索が出来るようにする

管理画面の投稿一覧右上にある検索ボックスは、デフォルトではタイトルと日付のみ?検索できるのですが、項目を追加したからといって、検索ワードに含んで検索してくれません。

php


function posts_search_custom_fields( $custom_search, $query ) {
	if ( $query->is_search() && $query->is_main_query() ) {
		global $wpdb;
		$q = $query->query_vars;
		$n = ! empty( $q['exact'] ) ? '' : '%';
		$searchand = '';

		foreach ( $q['search_terms'] as $term ) {
			$include = '-' !== substr( $term, 0, 1 );
			if ( $include ) {
				$like_op  = 'LIKE';
				$andor_op = 'OR';
			} else {
				$like_op  = 'NOT LIKE';
				$andor_op = 'AND';
				$term     = substr( $term, 1 );
			}
			$like = $n . $wpdb->esc_like( $term ) . $n;
			// カスタムフィールド用の検索条件を追加します。
			$search .= $wpdb->prepare( "{$searchand}(($wpdb->posts.post_title $like_op %s) $andor_op ($wpdb->posts.post_content $like_op %s) $andor_op (custom.meta_value $like_op %s))", $like, $like, $like );
			$searchand = ' AND ';
		}
		if ( ! empty( $search ) ) {
			$search = " AND ({$search}) ";
			if ( ! is_user_logged_in() )
				$search .= " AND ($wpdb->posts.post_password = '') ";
		}
		return $search;
	}
	else {
		return $custom_search;
	}
}
add_filter( 'posts_search', 'posts_search_custom_fields', 10, 2 );

//カスタムフィールド検索用のJOINを行います。
function posts_join_custom_fields( $join, $query ) {
	if ( $query->is_search() && $query->is_main_query() ) {
		// group_concat()したmeta_valueをJOINすることでレコードの重複を除きつつ検索しやすくします。
		global $wpdb;
		$join .= " INNER JOIN ( ";
		$join .= " SELECT post_id, group_concat( meta_value separator ' ') AS meta_value FROM $wpdb->postmeta ";
		$join .= " GROUP BY post_id ";
		$join .= " ) AS custom ON ($wpdb->posts.ID = custom.post_id) ";
	}
	return $join;
}
add_filter( 'posts_join', 'posts_join_custom_fields', 10, 2 );


検索は結構一人で書くのは難しいので、
こちらの記事を参考にさせていただきました。http://wpcj.net/1363

カスタム投稿もエクスポート可能な「WP All Export」

WP All Export 使い方
WP All Export 使い方

「WP All Export」というプラグインを使えば、カスタム投稿もエクスポートでき簡単にデータ管理することが可能です。
それに、このプラグインは、エクスポートする項目をテンプレートとして保存できるので、何度もエクスポートしたい場合はとても便利です!

やっぱり「MW WP Form」!!

これでまたもや「MW WP Form」の株が上がりました。笑

「MW WP Form」のカスタマイズで困ったときは違う方面から解決策を見つければ、「MW WP Form」は無敵じゃないかなと思います。笑