やったこと

webサービスを作るときに考えたことを垂れ流します

このブログについて

absgといいます。webサービスのこととかいろいろ書いてます。

最近作ったサイト
全国で発生した事件のデータベース「地域の事件簿」
みんなでなかよく政治の話!「なかよし討議!」
女子のつぶやきまとめ「Twiggy×Twiggy!」
ツイッターバトラーズ!
ニコニコ人気ユーザーランキング


連絡先
何かご相談がある人はご連絡ください。
http://absgexp.net/prof/con.html

    (⌒)
  ∧__∧ (~)
 (。・ω・。)( )
 { ̄ ̄ ̄ ̄}
 {~ ̄お__}  ゴユックリ ドゾー
 {~ ̄茶__}
 {____}

「wpdb->prepare」のプレースホルダの引数を動的にセットする!

ワードプレスでDBの検索をするときに、「wpdb->prepare()」というのを使ってSQL構文を準備しますよね。

↓こんな感じで使うやつです。

global $wpdb;

$prepared = $wpdb->prepare(
        'SELECT * FROM wp_post
        WHERE  post_type = %s AND post_status = %s AND post_author = %d',
'post', 'publish', 1);

$result = $wpdb->get_results($prepared);

上記は3つの値「post」「publish」「1」を、検索条件のプレースホルダとして渡しています。

このプレースホルダを動的に複数個設定したいときがあります。

ユーザーが自由に検索条件などをセットするときなどに、こういうのが必要になるんですね。

↓下記のようにすると、検索条件のプレースホルダを自由に追加していくこと出来ます。

global $wpdb;

$args = array();

$sql = "SELECT * FROM wp_post WHERE post_type = %s";
$args[] = $post_type;

if ($post_status){
  $sql .= " AND post_status = %s";
  $args[] = $post_status;
}
if ($post_author){
  $sql .= " AND post_author = %d";
  $args[] = $post_author;
}

$prepare_query = call_user_func_array(array($wpdb, 'prepare'), array_merge(array($sql), $args));
$result= $wpdb->get_results($prepare_query);


「call_user_func_array()」という関数を使うと、指定した関数にいくつも引数をセットして、呼び出すことことができるんですね。
(こんな便利な関数があるって知りませんでした・・)

以上!

【PHP】文字列を連結しようとしたらエラーがでる。。

すごいくだらないことを書きますよ・・?

PHPで文字列連結しようとしたら、下記のようなエラーが出てしまったんですよ。

「A non well formed numeric value encountered」
「 A non-numeric value encountered」

なぜかというと「+」で連結しようとしていたから。

//こんな書き方はない!
$str = "ほげ" + "はげ";

//これが正しい!
$str = "ほげ" . "はげ";

javascriptと間違えてときどきやってしまう、アホな失敗。

【PHP】xmlのタグの中の文字列をエスケープするよ!

xmlの中に「&」とか「<」とか「>」みたいな文字列が入っていると、simplexml_load_string()で読み込んだときにエラーしてしまいます!

そんなときはpreg_replace()で文字をエスケープして読み込んであげましょう!

下記は「< title >・・・&・・・・< /title >」みたいに書かれたタグの中を「< title >・・・& amp;・・・・< /title >」と置き換えてエスケープしています!

$content = file_get_contents('./hogehoge.xml');

//&をエスケープ
$content = preg_replace('/<title>(.+?)&(.+?)<\/title>/', '<title>>$1&amp;$2</title>', $content);

$rss = simplexml_load_string($content);

これでsimplexml_load_stringでちゃんとxmlが読めるね~!

以上!

【PHP】PHPのエラーをweb画面でも確認したい!

PHPでエラーが起きると、Web画面では「このページは動作していません」などど文章が表示されて、エラー内容を確認することできません。

Web画面でもエラーを確認したいときは、下記方法で一発でできます。

PHPコードの先頭にこれを追加するだけでおk。

<?php
ini_set( 'display_errors', 1 );

以上!

【AWS】Wordpressをhttps化!リダイレクトがトップページにしか効かない…。

先日ワードプレスのサイトをHTTPS化する作業をしました。

サーバはAWS(アマゾン)を使っていて、前方にあるロードバランサーhttpsを終端して、webサーバはhttpのレスポンスを処理するという、定番の構成です。

このとき、webサーバの「.htaccess」に、こんな感じでリダイレクト設定を書きますよね?

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !=https
RewriteRule ^/?(.*) https://%{HTTP_HOST}/$1 [R,L]
</IfModule>

このリダイレクトがトップページでしか有効にならずにちょっと悩んでしまいました…。

原因は、上記の設定を書く位置が悪かったです。

リダイレクト設定は、他の設定よりも一番上側に書いたほうがいいですね。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !=https
RewriteRule ^/?(.*) https://%{HTTP_HOST}/$1 [R,L]
</IfModule>

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

これでトップページ以外にも、ちゃんとリダイレクトが反映されます。

以上です!

【Wordpress】「functions.php」をいじってテストテンプレートを表示する!

ワードプレスで functions.php にコードを追加して、テストテンプレートを表示させる仕組みを作ります。

つまり、どういう事かと言うとですね・・。

①「http://hogehoge.com/」というサイトがあったとします。

②ここに「http://hogehoge.com/test_page/」みたいなテスト表示用のディレクトリを追加します(トップページの配下に追加します)

③この「/test_page/」にアクセスすると、自分が現在調整しているテンプレート(sample.php)を表示することできます。

こういうことがやりたい訳ですよ・・。

コードは以下です。これを「functions.php」に追加します。

add_action('init', 'add_test_page');
function add_test_page(){
  add_rewrite_endpoint('test_page', EP_ROOT);
  flush_rewrite_rules();
}

add_filter('query_vars', 'add_query_vars');
function add_query_vars($vars){
    $vars[] = "test_page";
    return $vars;
}

add_action('template_redirect', 'test_template_redirect');
function test_template_redirect() {
    global $wp_query;
    if (isset($wp_query->query['test_page'])) {
      include_once('sample.php');
      exit;
    }
}

これで「sample.php」をテスト表示することができます。

訳あって管理画面にアクセスできない人がテストページのデザイン修正するときに、この方法が使えると思います。

ところで、上記の「flush_rewrite_rules()」ですが、あまり連続的に呼び出すと、とても負荷が大きく、いろいろ不具合をもたらすのだそうな。

だから呼ぶのは一度だけでいいです。一回ページをロードしたら、下記のようにコメントアウトしてしまうといいと思います。

/*
add_action('init', 'add_test_page');
function add_test_page(){
  add_rewrite_endpoint('test_page', EP_ROOT);
  flush_rewrite_rules();
}
*/

add_filter('query_vars', 'add_query_vars');
function add_query_vars($vars){
    $vars[] = "test_page";
    return $vars;
}

add_action('template_redirect', 'test_template_redirect');
function test_template_redirect() {
    global $wp_query;
    if (isset($wp_query->query['test_page'])) {
      include_once('sample.php');
      exit;
    }
}


テスト確認が終わったら上記コードは消してしまいましょう。
(最後にもう一度「 flush_rewrite_rules()」を呼んで、追加した情報を消して元通りにしてあげるといいかも)

以上!