マンション売却査定プラグインのコードを解説します

2022年5月18日

この記事では、JISAKU-HPでダウンロードできるマンション売却査定プラグインのコードを解説しています。
プログラミング初心者の方も記述しているコードを理解して頂くことで、ご自身でカスタマイズしたりプラグインを作成することができるようになります。

マンション売却査定プラグインではphp、javascript、css、htmlのプログラミング言語を記述していますので、それらの知識が身につきます。

マンション売却査定プラグインは、マンション情報や査定データをデータベースに登録するため、データベースに接続する設定が必要です。下記のメールプラグインをインストールすることでマンション売却査定プラグインで作成するデータベースにアクセスできるようになります。

“Venteメール” をダウンロード vente_mail.zip – 177 回のダウンロード – 16 KB

マンション売却査定プラグインのファイル構成

下記よりマンション売却査定プラグインをダウンロードしていただき、zipファイルを解凍してください。

“マンション売却査定プラグイン” をダウンロード vente_m_baikyaku.zip – 146 回のダウンロード – 5 KB

解凍したフォルダには、下記のファイルがございます。

  1. functions.php
  2. manshon_baikyaku.php
  3. manshon_satei_log.php

各ファイルに記述しているコードを解説していきます。

functions.phpにプラグイン情報とプログラムが挙動するための関数を定義

functions.phpには、プラグイン情報やプログラムが挙動するための関数を定義しています。

<?php
/*
Plugin Name: Venteマンション売却査定
Plugin URI: https://jisaku-hp.jp/
Description: お使いのテーマでマンションの売却査定プログラムを表示できます。
Author: 廣本 隆史
Version: 1.0
Author URI: https://jisaku-hp.jp/
*/
function m_baikyaku_Include($params = array()) {
 extract(shortcode_atts(array('file' => 'default'), $params));
 ob_start();
 include(plugin_dir_path( __FILE__ ) . "/$file.php");
 return ob_get_clean();
}
add_shortcode('m_baikyaku', 'm_baikyaku_Include');
    global $wpdb;
    $table = $wpdb->prefix.'manshon';
    $table13 = $wpdb->prefix.'satei_log';
    //manshonテーブルが存在していなければ作成する
    if ($wpdb->get_var("SHOW TABLES LIKE '$table'") != $table) {
        $sql = "
            CREATE TABLE IF NOT EXISTS `$table` (
id int(10) unsigned AUTO_INCREMENT NOT NULL,
name varchar(255) NOT NULL,
address varchar(255) NOT NULL,
kaisuu text NOT NULL,
PRIMARY KEY (id)
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
        ";
        require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
        dbDelta( $sql );         
    }
    //satei_logテーブルが存在していなければ作成する
    if ($wpdb->get_var("SHOW TABLES LIKE '$table13'") != $table13) {
        $sql = "
            CREATE TABLE IF NOT EXISTS `$table13` (
id int(10) unsigned AUTO_INCREMENT NOT NULL,
type varchar(255) NOT NULL,
serial varchar(255) NOT NULL,
time varchar(255) NOT NULL,
name varchar(255) NOT NULL,
log varchar(255) NOT NULL,
PRIMARY KEY (id)
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
        ";
        require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
        dbDelta( $sql );         
    }
function original_page2() {
add_menu_page('マンション売却査定', 'マンション売却査定', 1, 'original_page2', 'manshon_satei_log', 'dashicons-building' ,202);
}
add_action('admin_menu', 'original_page2');
function manshon_satei_log() {include 'manshon_satei_log.php';}
function add_my_ajaxurl() {
?>
    <script>
        var ajaxurl = '<?php echo admin_url( 'admin-ajax.php'); ?>';
    </script>
<?php
}
add_action( 'wp_head', 'add_my_ajaxurl', 1 );
function view_sitename(){
$satei_mail = get_option('satei_mail');
$satei_from = get_option('satei_from_mail');
$name = $_POST{'name'};
$kaisuu = $_POST{'kaisuu'};
$kado = $_POST{'kado'};
$menseki = $_POST{'menseki'};
$satei = $_POST{'satei'};
$log = '面積:'.$menseki.'平米、階数:'.$kaisuu.'、角部屋:'.$kado.'、簡易査定金額:'.$satei;
date_default_timezone_set('Asia/Tokyo');
$time = date("Y/m/d H:i:s");
$serial = strtotime(date("Y/m/d H:i:s"));
mb_language("Japanese"); 																						
mb_internal_encoding("UTF-8");
$mes = $time."\r\n".$name."の売却査定がありました。\r\n\r\n";
$mes .= "【査定内容】\r\n";
$mes .= "面積:".$menseki."平米\r\n階数:".$kaisuu."\r\n角部屋:".$kado."\r\n簡易査定金額:".$satei."\r\n\r\nこのメールは送信専用ですので、返信できません。";
mb_send_mail($satei_mail, $name.'の売却査定', $mes, 'From:'.$satei_from);
if(isset($name)) {
    global $wpdb;
    $result = $wpdb->insert( $wpdb->satei_log, array( 'serial' => $serial, 'time' => $time, 'name' => $name, 'log' => $log, 'type' => 'マンション売却'),array('%d','%s', '%s', '%s', '%s'));
    $wpdb->query($result);
} else {
}
    die();
}
add_action( 'wp_ajax_view_sitename', 'view_sitename' );
add_action( 'wp_ajax_nopriv_view_sitename', 'view_sitename' );
?>

プラグイン情報

2行目から9行目までは、プラグイン情報を記述しています。

3行目の「Plugin Name: Venteマンション売却査定」は、プラグインの任意の名称です。

4行目の「Plugin URI: https://jisaku-hp.jp/」は、ご自身で作成されたプラグインを配布しているサイトの任意のURLを記述します。

5行目の「Description: お使いのテーマでマンションの売却査定プログラムを表示できます。」は、プラグインの概要です。

6行目の「Author: 廣本 隆史」は、プラグインの作者の名称です。

7行目の「Version: 1.0」はプラグインのバージョン情報です。

8行目の「Author URI: https://jisaku-hp.jp/」は、作者のホームページのURLを記術します。

マンション売却査定プログラムを呼び出すショートコードの関数を定義

マンション売却査定プログラムは、投稿ページや固定ページでショートコードにて呼び出します。10行目から16行目まではショートコードの関数を定義しています。

11行目の「extract(shortcode_atts(array('file’ => 'default’), $params));」は、shortcode_attsでショートコードのキーとデフォルト値を決めて、extractで連想配列のキーから変数を作成しています。これにより$file=defaultになっています。

13行目の「include(plugin_dir_path( __FILE__ ) . “/$file.php");」の「include(plugin_dir_path( __FILE__ ) 」は「functions.php」の置いているプラグインフォルダのパスを取得し、「. “/$file.php") 」の$fileは前述した$fileの変数で、ショートコード呼び出し時に入力されたファイル名が入ります。

16行目の「add_shortcode('m_baikyaku’, 'm_baikyaku_Include’);」で、ショートコードを登録します。

投稿記事や固定ページでショートコード「m_baikyaku file=manshon_baikyaku」を[]で括るとフォルダ内にある「manshon_baikyaku.php」のファイルを読み込みます。

マンション売却査定のデータベースを作成

マンション売却査定プログラムは、投稿ページや固定ページに設定したカスタムフィールドの情報をもとにショートコードでプログラムファイルを実行します。カスタムフィールドとの照合はデータベースに登録されたデータです。

ワードプレスでは「MySQL」というデータベース管理システムを使用しています。

「functions.php」の17行目から53行目で、データベースにマンション売却査定用のマンションデータテーブルと査定があった時にログを記録すテーブルを作成するコードを記述しています。どちらもインストール時に該当するテーブルがなければ作成する仕様なので上書きされることはありません。

ワードプレスには、データベースを操作するためのwpdb クラスが用意されており、wpdb クラスを通じて、データベース接続や、クエリ操作を行うことができます。

17行目の「global $wpdb;」を記述すればwpdbメソッドが利用できるようになります。

18行目と19行目では、$table,$table13に作成したいテーブルを代入します。「$wpdb->prefix」はテーブル接頭辞が格納されているので「.’manshon’」で接頭辞が「wp123456」だと「wp123456manshon」のテーブルが作成されることになります。

21行目の「if ($wpdb->get_var(“SHOW TABLES LIKE '$table'") != $table) {」は、前述した$tableがデータベースになければ、処理を実行します。

23行目から31行目はMySQLデータベースにテーブルを作成するsql文です。

24行目の「CREATE TABLE IF NOT EXISTS」は、同名のテーブルが存在しなければ作成します。

25行目から28行目はカラムを作成しています。カラム名、型情報の後ろの設定で「unsigned」は符号なし、「AUTO_INCREMENT」は1ずつ自動加算される連番、NOT NULLはnullを保存することを許可しない設定です。

29行目の「PRIMARY KEY (id)」は、カラム「id」の値を重複不可とする設定です。

34行目の「dbDelta( $sql );」のdbDelta()関数は、テーブルの作成、更新時に使用できます。

dbDelta()関数はwp-admin/includes/upgrade.phpファイル内にあって、デフォルトでは有効になっていないので33行目の「require_once( ABSPATH . 'wp-admin/includes/upgrade.php’ );」でインクルードします。

36行目から53行目もsatei_logのテーブルを作成するコードを記述しています。

マンション売却査定ログを閲覧するページをワードプレス管理画面のメニューに導入する

マンション売却査定プログラムでは、査定ログを記録してワードプレス管理画面で閲覧することができます。

54行目から58行目で査定ログ閲覧ページをワードプレス管理画面に導入するコードを記述しています。

55行目の「add_menu_page('マンション売却査定’, 'マンション売却査定’, 1, 'original_page2’, 'manshon_satei_log’, " ,202);」で、ワードプレス管理画面に表示する内容を記述しています。「 add_menu_page 」の内容はページタイトル、メニュータイトル、メニューに表示するユーザーの権限、メニューのスラッグ、メニュー表示時に使われる関数、メニューのテキスト左のアイコン、メニューを表示する位置になります。

57行目の「add_action('admin_menu’, 'original_page2’);」で、ワードプレス管理画面にメニューを追加します。

58行目の「function manshon_satei_log() {include 'manshon_satei_log.php’;}」は、プラグインフォルダ内の「manshon_satei_log.php」を読み込んでいます。

Ajaxによる非同期通信

マンション売却査定プログラムは、フォームを利用していて画面遷移しないように59行目から66行目で、Ajaxによる非同期通信を行うため、58行目で送信先をjavascriptのパラメータに出力します。

63行目から90行目は、ajaxリクエストを受け取るためのコードを記述しています。

64行目の「$satei_mail = get_option('satei_mail’);」は、査定があった時に通知するメールアドレスです。

65行目の「$satei_from = get_option('satei_from_mail’);」は、査定があった時に送信用メールアドレスです。

66行目から71行目は、送信側のデータを受け取り変数に代入しています。

72行目の「date_default_timezone_set('Asia/Tokyo’);」は、査定通知メールの内容で査定日時を送信するため、タイムゾーンを日本の時間に設定しています。

73行目の「$time = date(“Y/m/d H:i:s");」は、現在の時刻を2022/05/15 10:26:00の形式で変数に代入しています。

74行目の「$serial = strtotime(date(“Y/m/d H:i:s"));」は、査定ログの並び替えするためにUNIXタイムスタンプを変数に代入しています。

75行目の「mb_language(“Japanese");」は、メール送信における言語を設定しています。

76行目の「mb_internal_encoding(“UTF-8");」は、内部文字エンコーディングをUTF-8に設定しています。

77行目から79行目はメール本文の内容で、80行目の「mb_send_mail($satei_mail, $name.’の売却査定’, $mes, 'From:’.$satei_from);」は、メールを送信します。mb_send_mail ()の内容は、送信先メールアドレス、題名、本文、fromメールアドレスです。

81行目から86行目は査定内容のログをデータベースに登録するコードです。83行目の「$result = $wpdb->insert( $wpdb->satei_log, array( 'serial’ => $serial, 'time’ => $time, 'name’ => $name, 'log’ => $log, 'type’ => 'マンション売却’),array('%d’,’%s’, '%s’, '%s’, '%s’));」は、MySQL上のデータベースに登録する値の内容を変数に代入しています。

84行目の「$wpdb->query($result);」で、データベースの登録を実行します。

89行目と90行目はAjaxのアクションフックで、89行目の「add_action( 'wp_ajax_view_sitename’, 'view_sitename’ );」はログインユーザー用の関数、90行目の「add_action( 'wp_ajax_nopriv_view_sitename’, 'view_sitename’ );」は非ログインユーザーの関数です。

manshon_baikyaku.phpにマンション売却査定フォームを記述

manshon_baikyaku.phpはマンション売却査定フォームのコードを記述しています。

<div style="max-width:500px; padding:10px; margin:auto; border:solid 1px;">
<form method="post" target="_top" action-xhr="<?php echo post_permalink(); ?>" id="AjaxForm">
<?php
$name = post_custom('name');
global $wpdb;
$value = $wpdb->get_row("SELECT * FROM $wpdb->manshon WHERE name='$name'");
?>
<label style="display:block;">専有面積</label>
<input type="number" name="a" value="<?php echo post_custom('menseki');?>" size="10" onclick="op1.value ='(計算結果)'" style="margin:10px 0; height:50px;">
<label style="display:block;">階数</label>
<select name="b" class="b" onclick="op1.value ='(計算結果)'" style="margin:10px 0; height:50px;">
<?php
$kaisuu = explode(",",$value->kaisuu);
foreach ( $kaisuu as $kaisuu ) {
$k_value = explode(":",$kaisuu);
echo '<option value="'.$k_value[1].'">'.$k_value[0].'</option>';
}
?>
</select>
<label style="display:block;">角部屋</label>
<select name="d" class="d" onclick="op1.value ='(計算結果)'" style="margin:10px 0; height:50px;">
<option value="1">いいえ</option>
<option value="1.03">角部屋</option>
</select></td></tr>
<button type="submit" onclick="op1.value = Math.round(Number(a.value) * Number(b.value) * Number(d.value)/10000*0.97).toLocaleString()+'万円~'+Math.round(Number(a.value) * Number(b.value) * Number(d.value)/10000*1.03).toLocaleString()+'万円';" name="satei_manshon_count" style="margin:10px auto; height:50px; padding:10px; display:block;" class="manshon-button">簡易査定</button>
<input readonly="" name="op1" value="(計算結果)" id="satei" style="margin:10px 0; height:50px; color:red; border:none; font-size:2rem; width:100%; text-align:right; background:#ddd;">
</form>
</div>
<script>
jQuery(function ($) {
$('#AjaxForm').submit(function(event) {
    // HTMLでの送信をキャンセル
    event.preventDefault();
    var $form = $(this);
    var $button = $form.find('.manshon-button');
    var $name = "<?php echo post_custom('name');?>";
    var $menseki = $form.find('input[name="a"]').val();
    var $kaisuu = $form.find('.b option:selected').text();
    var $kado = $form.find('.d option:selected').text();
    var $satei = $form.find('input[name="op1"]').val();
    $.ajax({
        url: ajaxurl,
        type: 'POST',
        data: {
            'action' : 'view_sitename',
            'name' : $name,
            'kaisuu' : $kaisuu,
            'kado' : $kado,
            'menseki' : $menseki,
            'satei' : $satei,
        },
        timeout: 10000,  // 単位はミリ秒
        // 送信前
        beforeSend: function(xhr, settings) {
            // ボタンを無効化し、二重送信を防止
            $button.attr('disabled', true);
        },
        // 応答後
        complete: function(xhr, textStatus) {
            // ボタンを有効化し、再送信を許可
            $button.attr('disabled', false);
        },
        // 通信成功時の処理
        success: function(result, textStatus, xhr) {
            return;
        },
        // 通信失敗時の処理
        error: function(xhr, textStatus, error) {
            alert('エラー暫くたってからお試しください。');
        }
    });
    // …
});
});
</script>

4行目の「$name = post_custom('name’);」は、マンション売却査定プログラムを呼び出しする投稿ページや固定ページに設定しているカスタムフィールド「name」の値を変数に代入しています。この記事では「ベリスタ西宮北口」という名称を設定しています。

6行目の「$value = $wpdb->get_row(“SELECT * FROM $wpdb->manshon WHERE name=’$name'");」は、MySQL上のマンション情報を登録したテーブルに前述の「ベリスタ西宮北口」の値を取得し変数に代入しています。

11行目から19行目は「ベリスタ西宮北口」のkaisuuのカラムの値を取得して、フォームの階数のセレクトボックスに設定しています。

13行目の「$kaisuu = explode(“,",$value->kaisuu);」で、kaisuuの値を取得してexplode関数で「,」を指定して値を分割して配列として格納しています。ベリスタ西宮北口のkaisuuの値は、「1階:600000,2階:620000,3階:630000,4階:640000,5階:650000,6階:660000,7階:670000,8階:680000,9階:690000,10階:700000」です。各階毎に平米単価を値として設定しています。ですので、前述のexplode関数で、「$kaisuu[0]="1階:600000″、$kaisuu[1]="2階:620000″、$kaisuu[2]="3階:630000″、$kaisuu[3]="4階:640000″、…$kaisuu[9]="10階:700000″」という内容で10分割されて格納されます。

14行目から17行目ではforeachで繰り返し処理をして、さらにexplode関数で文字列を分割してセレクトボックスのoptionとして出力しています。

25行目の「onclick="op1.value = Math.round(Number(a.value) * Number(b.value) * Number(d.value)/10000*0.97).toLocaleString()+’万円~’+Math.round(Number(a.value) * Number(b.value) * Number(d.value)/10000*1.03).toLocaleString()+’万円’;"」は、フォームの簡易査定ボタンがクリックされたときに計算結果を表示するためのjavascriptです。

Math.round()関数は四捨五入、Number()は数値に変換、toLocaleString()は数値をロケールにあわせて文字列に変換した値を返します。

29行目から75行目は、Ajaxの送信側の処理内容を記述しています。この内容をfunctions.phpが受け取り実行します。

31行目の「$('#AjaxForm’).submit(function(event) {」はidがAjaxFormの簡易査定ボタンがクリックされたときに実行されます。

33行目の「event.preventDefault();」で、遷移をキャンセルしています。

34行目から40行目はフォームに入力された値を変数に代入しています。

41行目から71行目ではajaxメソッドの引数を指定してAjaxの設定を行っています。

42行目の「url: ajaxurl,」は、リクエストを送信する先のURLを指定。省略時は呼び出し元のページに送信します。WordPressでAjaxを使用する場合には、admin-ajax.phpの絶対パスを指定します。(functions.phpで指定しています。)

43行目の「type: 'POST’,」はHTTP通信の種類を指定しています。

44行目から51行目は、サーバーに送信するデータを指定しています。送信するデータが複数ある場合には値をオブジェクトで指定します。WordPressの場合はオブジェクトで指定し、その要素の1つは、キーをactionとして値にはWordPressのアクションフック名で利用する文字列を指定します。

64行目から66行目は、Ajax通信が成功した場合に、呼び出す関数を指定しています。

manshon_satei_log.phpに査定ログ閲覧のコードを記述

manshon_satei_log.phpはワードプレス管理画面で査定ログを閲覧するためのコードを記述しています。

<style>
table {
  border-collapse: collapse;
  margin:20px 0;
}
table th, table td {
  border: solid 1px black;
padding:10px;
}
</style>
<form method="post" action="options.php" enctype="multipart/form-data" encoding="multipart/form-data">
<h2>査定ログメール設定</h2>
<p>査定があった時に担当者用メールアドレスに通知します。Fromメールアドレスは任意のアドレスを入力してください。</p>
<p><label>担当者用メールアドレス</label><input size="60" type="text" id="satei_mail" name="satei_mail" value="<?php echo get_option('satei_mail'); ?>"></p>
<p><label>Fromメールアドレス</label><input size="60" type="text" id="satei_from_mail" name="satei_from_mail" value="<?php echo get_option('satei_from_mail'); ?>"></p>
    <?php submit_button(); ?>
</form>
<h2>マンション売却査定ログ</h2>
<p>直近100件分までがリスト表示されます。</p>
<form enctype="multipart/form-data" method="post">
<select name="id" class="upload">
<?php
global $wpdb;
$results = $wpdb->get_results("SELECT * FROM $wpdb->satei_log WHERE type = 'マンション売却' ORDER BY time DESC");
foreach ($results as $value) {
    echo '<option value='.$value->serial.'>'.$value->time.'以前</option>';
}
?>
</select>
<select name="name" class="upload">
<option value="全て">全て</option>
<?php
$results = $wpdb->get_results("SELECT distinct name FROM $wpdb->satei_log WHERE type = 'マンション売却'");
foreach ($results as $value) {
    echo '<option value='.$value->name.'>'.$value->name.'</option>';
}
?>
</select>
<input type="submit" name="_upload" value="検索">
</form>
<table>
<tbody>
<tr><th>日時</th><th>マンション名</th><th>査定内容</th></tr>
<?php
date_default_timezone_set('Asia/Tokyo');
$time = $_POST['id'];
$name = $_POST['name'];
if (isset($_POST['_upload'])) {
echo '<p>'.date("Y-m-d H:i:s",$time).'以前、'.$name.'で検索しました。</p>';
if($name != '全て'){
$results = $wpdb->get_results("SELECT * FROM $wpdb->satei_log WHERE serial <= '$time' and name = '$name' and type = 'マンション売却'  ORDER BY time DESC LIMIT 100");
}else{
$results = $wpdb->get_results("SELECT * FROM $wpdb->satei_log WHERE serial <= '$time'  and type = 'マンション売却' ORDER BY time DESC LIMIT 100");
}
foreach ($results as $value) {
    echo '<tr><td>'.$value->time.'</td><td>'.$value->name.'</td><td>'.$value->log.'</td></tr>';
}
}else{
$results = $wpdb->get_results("SELECT * FROM $wpdb->satei_log  WHERE type = 'マンション売却' ORDER BY time DESC LIMIT 100");
foreach ($results as $value) {
    echo '<tr><td>'.$value->time.'</td><td>'.$value->name.'</td><td>'.$value->log.'</td></tr>';
}
}
?>
</tbody>
</table>