WordPressのDBや関数を外部ファイルから利用できるようにする

プラグインを開発中、CSVでデータベース中にある、とあるデータをダウンロードできるようにしようとしたのですが、その際どうしてもWordPress外部のプログラムファイルにアクセスする必要があります。

そうすると、WordPressのコアにアクセスしないので、WordPressで用意されている、超便利な関数が利用できなかったり、WordPressのデータベースにアクセスするにも、独自にコードを用意する必要があったり、いろいろ面倒で、というか、そうするとWordPressを使っている値打ちが半減する気がしたので調べてみたら、ありました!

require_once( dirname(__FILE__) . '/wp-load.php' );

たったこれだけ。
とっても参考になったサイト:wordpress関数を外から使うにはwp_load.phpを読み込む

たとえば、プラグインフォルダにあるmy-plugin.phpというファイルから呼び出すときは、 /wp-content/plugins/my-plugin/my-plugin.php のようにルートまでに4階層あるので、

require_once( dirname(dirname(dirname(dirname( __FILE__ )))) . '/wp-load.php' );

と、dirnameを4個つらねて階層分たどればOK!

これで、DBへ面倒な接続なんかしなくても、$wpdbが利用できます。
ていうか、プラグイン開発する際にはないとこまりますね。  

WordPress プラグイン開発でつかうURL関係関数

プラグインで実行中のファイルのURL

echo plugin_basename(__FILE__);
// myplugin/downLoad.php のように返してくる。 

__FILE__ は現在のファイルのディレクトリを示します。(URLではない)
ちなみに、WP_PLUGIN_DIR でプラグインディレクトリ(URLではない)を取得できます。
ちなみにちなみに、dirname(__FILE__)で、現在のファイルのディレクトリ(URLではない)を取得できます。

フルパスを得たければ、公式リファレンスでは、

$x = WP_PLUGIN_URL.'/'.str_replace(basename( __FILE__),"",plugin_basename(__FILE__));

とあるが、

echo plugins_url('' , __FILE__);

のほうがシンプル

任意のファイルのURLを取得するときは、

echo plugins_url("downLoad.php?data=5", __FILE__);

なかんじで。

URLパラメータ

URLにパラメータを付加したい場合は、

$old_url = $_SERVER['REQUEST_URI'];
$new_url = esc_url(add_query_arg(array('data'=>'5') , $old_url));

上の例では、現在のURLにパラメータを付加しているけれど、それなら、

$new_url = esc_url(add_query_arg(array('data'=>'5')));

でOK パラメータを削除するには、

$new_url = esc_url(add_query_arg(array('data'=>false)));
//または
$new_url = esc_url(add_query_arg('data'));

任意のURLにパラメータ ちなみに、JavaScriptでのパラメータ付加はこちら。
JavaScript URLのパラメータを取得、設定する

PHP 値の受け渡しで気をつけること。

$_GET、$_POST、$_COOKIE の値の受け取りは、セキュリティ上気をつけないといけないですが、 毎回コードを書くのも面倒なので。

class common{
   public static function getGET($name){
        $ret = filter_input(INPUT_GET, $name);
        if (isset($ret)){
            $ret =str_replace("\0", "", $ret);//Nullバイト攻撃対策
            return htmlspecialchars($ret, ENT_QUOTES, 'UTF-8');
        }
        return '';
    }

    public static function getPost($name){
        $ret = filter_input(INPUT_POST, $name);
        if (isset($ret)){
            $ret =str_replace("\0", "", $ret);//Nullバイト攻撃対策
            return htmlspecialchars($ret, ENT_QUOTES, 'UTF-8');
        }
         return '';
    }

    public static function getCookie($name){
        $ret = filter_input(INPUT_COOKIE, $name);
        if (isset($ret)){
            $ret =str_replace("\0", "", $ret);//Nullバイト攻撃対策
            return htmlspecialchars($ret, ENT_QUOTES, 'UTF-8');
        }
         return '';
    }
}

で、呼び出すときは、

$data = common::getGet('data');

のようにして使える。   参考:PHP - $_GET, $_POSTなどを受け取る際の処理 参考:PHP開発エンジニア必読!最低限必要なセキュリティ対策

JavaScript URLのパラメータを取得、設定する

JQueryで、URLにパラメータを追加する必要があったので、パラメータを取得、設定する関数を用意しました。

下記例では、class="addPrm" の要素をクリックすると、name=tanaka&age=54というパラメータをURLに付加して遷移する、という感じです。

$( '.addPrm' ).on( 'click', function(){
        var params = getParameter();
        params['name'] = 'tanaka';
        params['age'] = 54;
        window.location.href = setParameter(params);
    });
 
    //パラメータを設定したURLを返す
    function setParameter( paramsArray ) {
        var resurl = location.href.replace(/\?.*$/,"");
        for ( key in paramsArray ) {
            resurl += (resurl.indexOf('?') == -1) ? '?':'&';
            resurl += key + '=' + paramsArray[key];
        }
        return resurl;
    }
 
    //パラメータを取得する
    function getParameter(){
	var paramsArray = [];
	var url = location.href; 
	parameters = url.split("#");
	if( parameters.length > 1 ) {
		url = parameters[0];
	}
	parameters = url.split("?");
	if( parameters.length > 1 ) {
		var params	 = parameters[1].split("&");
		for ( i = 0; i < params.length; i++ ) {
		   var paramItem = params[i].split("=");
		   paramsArray[paramItem[0]] = paramItem[1];
		}
	}
	return paramsArray;
    };

getParameter() で現在のページのURLパラメータを取得します。

setParameter() で任意のパラメータ(例ではnameとage)を追加したURLを返します。

参考になったサイト:http://moriroom.my.coocan.jp/site1/?p=1581

追記:2016/02/16
パラメータのあとに#が付いている場合に対応するように、getParameter()を修正

WordPress 投稿や固定ページを追加したり削除する

プラグインなどから、プログラムで投稿や固定ページを追加するには、wp_insert_post() を使います。

$post = array(
     'post_name' => $slug ,
     'post_title' => $title,
     'post_content' => $content,
     'post_status' => 'publish',
     'post_type' => 'page',
 );
wp_insert_post($post);

投稿や固定ページをゴミ箱に入れるには、wp_delete_post() を使います。

wp_delete_post($post_id);

投稿や固定ページを完全に削除するには、wp_delete_post() の第二パラメータにTrueを追加。

wp_delete_post($post_id , true);

WordPressでプラグインなどからユーザー登録する方法

ユーザーの登録するときは、 wp_insert_user() 更新するときは、 wp_update_user() を使います。

        $userdata = array(
            'first_name'    =>  '菊池',
            'last_name'    =>  '桃子',
            'user_login'  =>  'momoko',
            'user_email'    =>  'momoko@email.com',
            'role'    =>  'subscriber',
            'user_pass'   =>  'password'
        );
        $user_id = username_exists( 'momoko');
        if ( $user_id ) {
            $userdata['ID'] = $user_id;
            $user_id = wp_update_user( $userdata );
        }else{
            $user_id = wp_insert_user( $userdata );
        }

username_exists('ユーザー名') で、既に登録済みかを確認できます。
存在していたら、そのユーザーID、 存在してなければ、nullになります。

rorleについて、情報収集に手間取ったのでメモ

管理者: administrator
編集者: editor
寄稿者: author
購読者: subscriber

かならず半角小文字でいれる。(下記参考にしたがって、一文字目を大文字にしたらうまく行きませんでした。)
参考:https://codex.wordpress.org/Roles_and_Capabilities#Administrator

WordPressでページの種類ごとに表示する内容を変える

WordPressでのページの種類ごとの分岐

if ( is_single() ) :
elseif ( is_single( 125 ) ) :
elseif ( is_single( 125, 'postslug', '投稿タイトル' ) ) :
//投稿ページ
//引数は、投稿ID、投稿タイトル、slug のいずれかか、それらを含めた配列
elseif (is_page()) :
elseif (is_page( 10 )) :
elseif (is_page( 10, 'pageslug', '固定ページタイトル' )) :
//固定ページ
//引数は、固定ページID、固定ページタイトル、slug のいずれかか、それらを含めた配列
elseif (is_category()) :
elseif (is_category(13)) :
elseif (is_category(array( 125, 'postslug', '投稿タイトル' ))) :
//カテゴリーページ
//引数は、カテゴリーID、カテゴリー名、slug のいずれかか、それらを含めた配列
elseif (is_archive()) :
//アーカイブページ
elseif (is_post_type_archive()) :
elseif (is_post_type_archive('customposttype')) :
elseif (is_post_type_archive( array( 'apples' , 'oranges' )) :
//カスタムタクソノミーのアーカイブページ
//引数はカスタムタクソノミーのpost_type またはその配列
elseif (is_tax()) :
elseif (is_tax( 'taxonomy-slug' )) :
elseif (is_tax( 'taxonomy-slug' , array( 5 , 'tarm-slug' , 'タームの名前' )) :
//カテゴリー、投稿タグ以外(カスタムタクソノミー?)のアーカイブのとき
//第1引数は、タクソノミーのslugまたはその配列
//第2引数は、タームID、ターム名、タームのslug のいずれかか、それらを含めた配列
//ちなみに、タームはタクソノミーやカテゴリに属する一つ一つの分類のこと。
elseif (is_day()) :
//日別のアーカイブ
elseif (is_month()) :
//月別のアーカイブ
elseif (is_year()) :
//年別のアーカイブ
elseif (is_404()) :
//404ページ
elseif (is_front_page()) :
//フロントページ
//管理画面の設定で、表示設定→フロントページの表示 で「最新の投稿」を選択しているときは、最新の投稿ページが表示されている場合
//「固定ページ」を選択しているときは、「フロントページ」に指定したページが表示されている場合。
elseif (is_home()) :
//ホームページ(トップページのこと)
//管理画面の設定で、表示設定→フロントページの表示 で「固定ページ」+「フロントページ」に指定したページが表示されている場合。
elseif (is_search()) :
//検索結果
elseif (is_attachment()) :
//アップロードした画像などのメディアを表示しているとき
elseif (is_singular()) :
elseif (is_singular('post_types')) :
//is_page、is_single、is_attachment のいずれかがTrueになる時
elseif (is_sticky($post_ID)) :
//□この投稿をフロントページに固定 にチェックが入っている時
//引数には投稿IDを入れる。
elseif (is_tag()) :
elseif (is_tag( 56 )) :
elseif (is_tag(  56 , 'tagslug' , 'タグ名' )) :
//タグページ
//引数は、タグID、タグ名、slug のいずれかか、それらを含めた配列
elseif (is_admin()) :
//管理画面
endif;

WordPressでカテゴリごとにページングしたい時

投稿ページ(シングルページ)で前後の記事にリンクを貼る時(ページング)
previous_post_link('%link' , '%title');
next_post_link('%link' , '%title');
としますが、カテゴリ毎にページングしたいときは、第三引数に TRUE を入れます。
previous_post_link('%link' , '%title' , TRUE );
next_post_link('%link' , '%title' , TRUE );
これで、カテゴリごとにページング出来るようになります。