wpdpのSELECT

サンプル

	global $wpdb;
	$data = $wpdb->get_results(
			"
			SELECT *
			FROM enq_test_animal
			WHERE id = 2
			"
			);
			
	// stdClassオブジェクトから配列に変換する
	$data2=array();
	if(!empty($data)){
		foreach($data as $stdClassEnt){
			$data2[] = (array) $stdClassEnt;
		}
		
	}
	

取得したデータのエンティティはstdClass型となっているので、必要に応じて配列型に変換してやる必要がある。

get_results以外のSELECT

SELECT関数説明
$wpdb->get_var( "SQL文" );値を一つ取得する
$wpdb->get_row( "SQL文" );行を一つ取得する
$wpdb->get_col( "SQL文" );列を一つ取得する

外部結合

JOINもSQL文の個所に直接記述する。


JavaScriptとCSSのインクルード | プラグイン開発


	// 管理者メニューへ項目を追加する
	add_action('admin_menu', function(){
		add_menu_page('動物プラグイン', 'アンケーター管理','publish_posts','test_animal/test_animal.php','showContents');
	});
	
	function showContents(){ 
		wp_enqueue_style( 'neko', '/wp-content/plugins/test_animal/css/neko.css' ); // CSSのインクルード
		wp_enqueue_script( 'neko', '/wp-content/plugins/test_animal/js/neko.js' ); // JSのインクルード
		wp_enqueue_script( 'yagi', '/wp-content/plugins/test_animal/js/yagi.js', [], '1.2.3' ); // JSのインクルード | バージョンを付加
	} 
	

wp_enqueue_style関数およびwp_enqueue_script関数について

第1引数
ハンドルとして使われる名称とのこと。
一応何でもよいらしいが、他の読込と重複させないほうがよさげである。ファイルの名前部分を記述するのが無難。
「.」ドット記号が含まれるとエラーになるようである。

第2引数
js,cssのファイルパスを指定する。

第3引数
省略してもよい。
解説サイト

第4引数
バージョンを入力すると、インクルードにバージョンが付加される。キャッシュ対策に必須。
/wp-content/plugins/test_animal/js/yagi.js?ver=1.2.3

第5引数
省略してもよい。

wp_headフック
wp_headフックを使う方法があるがプラグイン開発では無意味。
wp_headのフック自体が動かないからである。

問題点
上記の方法ではhead要素内にインクルードの記述ができない。
そのため、wp_enqueue_styleとwp_enqueue_scriptを利用するメリットがあまりない。

結局のところ、HTMLで直接記述する方法(<script ~)のほうが手っ取り早い気がする。


WordPressのjQueryについて | 注意

jQueryは最初からWordPressに内蔵されている。
ただし$ 記号は使えないため、「jQuery('#xxx')」としなければならない。

別バージョンのjQueryを読み込んだとしても$ 記号は利用できない。


	jQuery(function(){
		console.log('HelloWorld=');
		console.log(jQuery.fn.jquery);// jQueryのバージョンを出力
	});
	
内臓されているjQueryのバージョンは2017年4月の時点で1.12である。


WordPressの各種パスを取得する関数

関数説明
home_url()ホームURLhttp://localhost/animals
site_url()サイトパスURLhttp://localhost/animals/wordpress
admin_url()管理画面パスURLhttp://localhost/animals/wp-admin
content_url()コンテンツパスURLhttp://localhost/animals/wp-content
includes_url() インクルードパスURLhttp://localhost/animals/wp-includes
plugins_url()プラグインパスURLhttp://localhost/animals/wp-content/plugins
wp_upload_dir()アップロードディレクトリURL (配列)http://localhost/animals/wp-content/uploads

ログイン中のユーザー情報を取得する

wp_get_current_user関数でログイン情報を取得できる。

	$wpUser = wp_get_current_user();
	var_dump($wpUser);
	

ログインユーザー名を取得する

	$wpUser = wp_get_current_user();
	var_dump($wpUser->data->user_login);
	


WordPressのAjax 管理画面用

WordPressプラグインではAjaxの使い方が特殊である。一般のWebアプリのようにはいかない。
以下にサンプルコードを記述する。

なお、管理画面(ダッシュボード)でしか、下記のサンプルは動作しない。
公開ページにおいてのAjaxの方法は異なる。

プラグインファイル構成

ajax_animal.js
ajax_animal.php


ajax_animal.php

	<?php
	/*
	 Plugin Name: Ajaxテスト・アニマル・プラグイン
	 Plugin URI: http://amaraimusi.sakura.ne.jp/note_prg/wordpress/
	 Description: WordPressプラグインのAjaxテストです。
	 Version: 1.0
	 Author: kenji uehara
	 Author URI: http://amaraimusi.sakura.ne.jp/
	 License: MIT
	 */
	class AjaxAnimal {
		public function __construct(){
	 		// Ajaxで呼び出すメソッドを設定する
			$ajax_actions = array(
					"ajax_animal_test1" => array("action" => "ajax_animal_test1_action", "function" => "test1"),
					//"ajax_animal_test2" => array("action" => "ajax_animal_test2_action", "function" => "test2"),
			);
			foreach ($ajax_actions as $custom_key => $custom_action) {
				// アクションコード「wp_ajax_nopriv_〇〇」は、非ログイン中でもAjaxの動作を受け付ける。(ログイン中は動作せず?)
				add_action("wp_ajax_nopriv_" . $custom_action['action'], array($this, $custom_action["function"]));
				
				// アクションコード「wp_ajax_〇〇」は、ログイン中のみAjaxの動作を受け付ける。
				add_action("wp_ajax_" . $custom_action['action'], array($this, $custom_action["function"]));
			}
			
			// 管理者メニューへ項目を追加する
			add_action('admin_menu', function(){
				add_menu_page('Ajaxテスト・アニマル', 'Ajaxテスト・アニマル','publish_posts','ajax_animal',function(){
					
					$plugin_path = plugins_url() . '/ajax_animal/';
					echo "<script src='{$plugin_path}ajax_animal.js'></script>";
					
					echo '<p>Ajaxテスト・アニマル</p>';
					$wp_ajax_url = admin_url('admin-ajax.php');
					echo "<input id='admin-ajax-url' type='hidden' value='{$wp_ajax_url}' />";
					$nonce = $nonce = wp_create_nonce("unique_key");
					echo "<input id='nonce' type='hidden' value='{$nonce}' />";
					
					echo "<input type='button' value='Ajaxテスト' onclick='ajax_test1()' />";
					echo "<div id='res' style='color:green'></div>";
					echo "<div id='err' style='color:red'></div>";
				});
			});
		}
		
		/**
		 * Ajaxのサーバー側
		 */
		public function test1(){
			// トークンによるアクセスの正当性を確認
			$nonce = $_POST['nonce'];
			if (!wp_verify_nonce($nonce, 'unique_key')){
				die('nonce error');
			}
			
			// データを受け取る
			$json_param=$_POST['key1'];
			$json_param = stripslashes($json_param);
			$data = json_decode($json_param,true);//JSON文字を配列に戻す
			
			// 任意の処理
			$data[1]['name1'] = 'Wild Pig';
			$res = $data;
				
			// JSONレスポンスを出力
			header("Content-Type: application/json; charset=utf-8");
			echo json_encode($res);
			exit;
		}
	
	}
	
	$ajaxAnimal = new AjaxAnimal();
	

ajax_animal.js

	/**
	 * Ajaxテスト・アニマル
	 */
	function ajax_test1(){
		var url = jQuery('#admin-ajax-url').val();
	
		// フォームデータを生成
		var fd = new FormData();
	
		// フォームデータに送信データをJSON変換してからセットする。
		var data = [{'id':99,'name1':'タヌキ'},{'id':100,'name1':'イノシシ'}];
		var json = JSON.stringify(data);
		fd.append( "key1", json );
		
		// WordPressのAjaxで必要なパラメータをセットする
		var action = 'ajax_animal_test1_action';
		var nonce = jQuery('#nonce').val();
		fd.append('action',action);
		fd.append('nonce',nonce);
	
		// AJAX通信
		jQuery.ajax({
			type: "post",
			url: url,
			data: fd,
			cache: false,
			dataType: "text",
			processData: false,
			contentType : false,
		})
		.done(function(str_json, type) {
			var ent;
			try{
				ent =jQuery.parseJSON(str_json);//パース
	
				jQuery("#res").html('Ajax通信成功!<br>');
				jQuery("#res").html(str_json);
			}catch(e){
				alert('エラー');
				jQuery("#err").html(str_json);
			}
			
		})
		.fail(function(jqXHR, statusText, errorThrown) {
			jQuery('#err').html(jqXHR.responseText);
			alert(statusText);
		});
	}
	

デバッグの方法

PHP側で致命的なエラーが発生すると、admin-ajax.phpで500番エラーになる。
詳しいエラー内容はdebug.logに出力されるので、デバッグするときはこちらを参考にすると良い。
debug.logの場所は"ワードプレスのホーム\wp-content\debug.log"である。


WordPressのAjax 公開ページ用

サンプルはWordpressのプラグイン形式。公開ページにショートコードに組み込んでいる。


ajax_fish.php(プラグインのスタートアップであるモジュール)

	<?php

/*
 Plugin Name: Ajax Fish
 Plugin URI: http://amaraimusi.sakura.ne.jp/
 Description: WordPress公開ページにおけるAjaxのテストです。
 Version: 1.0
 Author: kenji uehara
 Author URI: http://amaraimusi.sakura.ne.jp/
 License: MIT
 */
// ショートコード
add_shortcode('ajax-fish-test1','ajaxFishTest1');

function ajaxFishTest1(){
	wp_enqueue_script( 'jquery3', '/wp-content/plugins/ajax_fish/jquery3.js' );
	wp_enqueue_script( 'send_ajax', '/wp-content/plugins/ajax_fish/send_ajax.js' );
	$html = "
		<div>
			<h3>Ajax Fish Test</h3>
			<div>WordPress公開ページにおけるAjaxのテストです。</div>
			<input type='button' value='Ajaxテスト' onclick='ajax_fish_test1()' />
			<div id='res' style='color:#60C894'></div>
			<div id='err style='color:red''></div>
		</div>
	";
	return $html;
}
	

send_ajax.js

	function ajax_fish_test1(){
		let ajax_url = '/wp/wp-content/plugins/ajax_fish/res_ajax.php';
		let sendData={aaa:'cat', bbb:'dog'};
		let send_json = JSON.stringify(sendData);//データをJSON文字列にする。
	
		// AJAX
		jQuery.ajax({
			type: "POST",
			url: ajax_url,
			data: "key1=" + send_json,
			cache: false,
			dataType: "text",
		})
		.done((res_json, type) => {
			let res;
			try{
				res =jQuery.parseJSON(res_json);//パース
			}catch(e){
				jQuery("#err").append(res_json);
				return;
			}
			jQuery("#res").append(res_json);
		})
		.fail((jqXHR, statusText, errorThrown) => {
			jQuery('#err').append('アクセスエラー');
			jQuery('#err').append(jqXHR.responseText);
			alert(statusText);
		});
	}
	

res_ajax.php

	<?php
	
	// 通信元から送信されてきたパラメータを取得する。
	$param_json = $_POST['key1'];
	$param=json_decode($param_json,true);//JSON文字を配列に戻す
	
	//データ加工や取得
	$param['bbb'] = 'tanuki';
	$param['ccc'] = 'pig';
	
	// JSONに変換し、通信元に返す。
	$json_str = json_encode($param, JSON_HEX_TAG | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_HEX_APOS);
	echo $json_str;
	

ショートコードの開発

ショートコードはプラグインの一機能である。
ショートコードの処理はプラグインPHPモジュールに記述する。

test_animal.php プラグイン


	<?php
	/*
	 Plugin Name: テスト・アニマル・プラグイン
	 Plugin URI: http://amaraimusi.sakura.ne.jp/note_prg/wordpress/
	 Description: プラグイン開発のHello Worldです。
	 Version: 1.0
	 Author: kenji uehara
	 Author URI: http://amaraimusi.sakura.ne.jp/
	 License: MIT
	 */
	class TestAnimal {
	
		public function __construct(){
	
	
			// ショートコード
			add_shortcode('bark-dog',array($this, 'barkDog'));
		}
		
		public function barkDog($attr){
			$dog_name = 'U゚ェ゚U';
			if(!empty($attr['dog_name'])){
				$dog_name = $attr['dog_name'];
			}
			return "<span style='color:#e84646'>{$dog_name} ワンワン!!</span><br>";
		}
	}
	$testAnimal = new TestAnimal();
	

ショートコードの使い方

投稿の編集を開き、文章中に下記のショートコードを入力して更新する。
	[bark-dog dog_name="ポチ" ]


サイト表示
フロント画面で確認すると、ショートコードが実行されているのが分かる。




テーマや他のプラグインからショートコードを呼び出す

do_shortcode関数を使えばよい。
テーマや他プラグインのphpファイルに以下を記述する。
	echo do_shortcode('[bark-dog dog_name="ポチ" ]');


投稿IDを取得する

	<?php echo get_the_ID(); ?>

例外を投げる時の注意

WordPressプラグイン開発の例外について

メインループ中でない場合、例外をそのまま投げても画面にエラー内容が表示されない。
なのでvar_dumpを併用せねばならない。


	// メインループ中の処理にあらず
	try {
	
		
	} catch (Exception $e) {
		$err_msg = '$table is empty!';
		var_dump('Erorr:'.$err_msg);
		throw new Exception($err_msg);// ← 画面にエラーメッセージは表示されない
	
	}
	

投稿でJavaScriptを記述する

投稿の編集からJavaScriptを入力することができる。
scriptタグをdivタグで囲めばよい。
入力するときはHTMLタブではなくTEXTタブに切り替えてから入力すること。

注意点
JavaScript内に<div>を書いてはいけない。 WordPressは<div>に反応してしまう。<span>は大丈夫。
空行を入れないこと。空行を入れるとエラーになる。


	<div>
	<script type="text/javascript">
	alert('JavaScriptを投稿します');
	</script>
	</div>
	


参考サイト