画像を簡単に中央寄せにする

下のようなHTMLの場合、

<div class="image">
	<p><img src="/image/example.jpg" alt="example" /></p>
</div>

もっとも多く用いられるCSS

.image p {
	text-align: center;
}

だと思いますが、
今回はもっと簡単な方法。

image img {
	display: block;
	margin: auto;
}

また、右寄せ、左寄せの場合は下のようになる。

/* 右寄せ */
image img {
	display: block;
	margin-left: auto;
}
/* 左寄せ */
image img {
	display: block;
	margin-right: auto;
}

.htaccessのBasic認証とIP制限の設定方法

.htaccessを利用しBasic認証で許可したIPアドレス以外からのサイトへのアクセスを制限する方法。

AuthType Basic
AuthUserFile /path/to/.htpasswd # パスワードファイル
AuthName "Please input your Account & Password" # Basic認証時のテキスト
Require valid-user
Satisfy Any # IPまたはID認証がOKなら許可する
order deny,allow 
Allow from [許可するIPを記述]
deny from all

これでアクセス元IPが許可IPの場合はBasic認証が表示されない。

指定したURLのスクリーンショットを画像を取得し表示させるショートコード

指定したURLのスクリーンショット画像を生成するwordpressプラグインBM Shots』がありますが、アクセスの度に画像取得を実行するのが嫌だったので自分のサーバに画像を保存し保存された画像を表示するようなショートコードを作成しました。

記載しているショートコードの利用は自由ですが、特にテストなど行っていないので利用される場合は、自己責任でお願いします。ショートコードの利用により生じた不具合などの責任は負いかねますので予めご了承ください。あしからず。

コード

<?php
# functions.php
// 指定URLのスクリーンショットを描画
function screenshotSc($atts, $content = null) {
	global $post;
	define('DS', '/');
	// 画像保存ディレクトリ
	define('SCREENSHOT_DIR', '画像保存ディレクトリパスを記述');
	extract(shortcode_atts(array(
		"base"=>'http://s.wordpress.com/mshots/v1/',
		"url" => '',
		"class" => 'line1',
		"alt" => '',
		"file" => '',
		"link" => '',
		"width" => '800',
		"height" => '533'
	), $atts) );
	if( empty( $url ) || empty( $file ) ) return null;
	/* 処理 */
	$image_flag=false;
	$dir=SCREENSHOT_DIR;
	$date=$post->post_date;
	$year=date('Y', strtotime($date) );
	$month=date('m', strtotime($date) );
	$filename='http://'.$_SERVER['HTTP_HOST'].DS.'blog'.DS.'wp-content'.DS.'themes'.DS.'oniloq'.DS.'images'.DS.'screenshot'.DS.$year.DS.$month.DS.$file.'.jpg';
	if( !file_exists($dir.$year) ) {
		mkdir($dir.$year);
	}
	if( !file_exists($dir.$year.DS.$month) ) {
		mkdir($dir.$year.DS.$month);
	}
	if( file_exists($dir.$year.DS.$month.DS.$file.'.jpg') ) {
		$image_flag=true;
	}
	if( !$image_flag ) {
		$url=$base.urlencode($url).'?w='.$width.'&h='.$height;
		$image=file_get_contents($url);
		file_put_contents($dir.$year.DS.$month.DS.$file.'.jpg', $image);
	}
	if( !empty($class) ) $class='class="'.$class.'"';
	$img = '<img '.$class.' src="'.$filename.'" alt="' . $alt . '"/>';
	if( empty($link) ) return $img; 
	return '<p>' . '<a href="' . $link . '">' . $img . '</a>' . '</p>';
}
add_shortcode("Screenshot", "screenshotSc");

記事内

記事内では下記の様なショートコードを記述する

[Screenshot url="http://google.co.jp/" file="filename" alt="google" link="http://google.co.jp"]

imap関数を使ってGmailのメールを取得する

以前、Gmailよりメールを取得し、データベースへ反映する機能の構築を実装したのでメモしておきます。はじめに、Gmailの設定でimapが有効になっていることを確認する。imapが有効になっていない場合は、有効にします。

imap関数の詳しい情報はPHP: IMAP - Manualを参考に!

<?php
// 必要な定数を設定
define('GMAIL_HOST','imap.googlemail.com');
define('GMAIL_PORT',993);
define('GMAIL_ACCOUNT','アカウント名');
define('GMAIL_PASSWORD','パスワード');
define('SERVER','{'.GMAIL_HOST.':'.GMAIL_PORT.'/novalidate-cert/imap/ssl}');

// メールボックスへの IMAP ストリームをオープン
if (($mbox = @imap_open(SERVER."INBOX", GMAIL_ACCOUNT, GMAIL_PASSWORD)) == false) {
	// 失敗処理を記述...
}
// メールボックスの情報を取得
$mboxes=imap_mailboxmsginfo($mbox);
// メッセージ数の有無
if( $mboxes->Nmsgs != 0 ) {
	// 情報を格納する変数を初期化
	$mail=null;
	for( $mailno=1; $mailno<=$mboxes->Nmsgs; $mailno++ ) {
		// ヘッダー情報の取得
		$head=imap_header($mbox, $mailno);
		// アドレスの取得
		$mail[$mailno]['address']=$head->from[0]->mailbox.'@'.$head->from[0]->host;
		// タイトルの有無
		if( !empty($head->subject) ) {
			// タイトルをデコード
			$mhead=imap_mime_header_decode($head->subject);
			foreach( $mhead as $key=>$value) {
				if( $value->charset != 'default' ) {
					$mail[$mailno]['subject']=mb_convert_encoding($value->text,'UTF-8',$value->charset);
				}else{
					$mail[$mailno]['subject']=$value->text;
				}
			}
		}else{
			// タイトルがない場合の処理を記述...
		}
		// 格納用変数の初期化
		$charset=null;
		$encoding=null;
		$attached_data=null;
		$parameters=null;
		// メール構造を取得
		$info=imap_fetchstructure($mbox, $mailno);
		if( !empty($info->parts) ) {
			// 
			$parts_cnt=count($info->parts);
			for( $p=0; $p<$parts_cnt; $p++ ) {
				// タイプにより処理を分ける
				// [参考] http://www.php.net/manual/ja/function.imap-fetchstructure.php
				if( $info->parts[$p]->type == 0 ) {
					if( empty( $charset ) ) {
						$charset=$info->parts[$p]->parameters[0]->value;
					}
					if( empty( $encoding ) ) {
						$encoding=$info->parts[$p]->encoding;
					}
				}elseif(!empty($info->parts[$p]->parts) && $info->parts[$p]->parts[$p]->type == 0){
					$parameters=$info->parts[$p]->parameters[0]->value;
					if( empty( $charset ) ) {
						$charset=$info->parts[$p]->parts[$p]->parameters[0]->value;
					}
					if( empty( $encoding ) ) {
						$encoding=$info->parts[$p]->parts[$p]->encoding;
					}
				}elseif($info->parts[$p]->type == 5){
					$files=imap_mime_header_decode($info->parts[$p]->dparameters[0]->value);
					if(!empty($files) && is_array($files) ) {
						$attached_data[$p]['file_name']=null;
						foreach($files as $key => $file) {
							if( $file->charset != 'default') {
								$attached_data[$p]['file_name'].=mb_convert_encoding($file->text, 'UTF-8', $file->charset);
							}else{
								$attached_data[$p]['file_name'].=$file->text;
							}
						}
					}
					$attached_data[$p]['content_type'] = $info->parts[$p]->subtype;
				}
			}
		}else{
			$charset=$info->parameters[0]->value;
			$encoding=$info->encoding;
		}
		if( empty($charset) ) {
			// エラー処理を記述...
		}
		// 本文を取得
		$body=imap_fetchbody($mbox, $mailno, 1, FT_INTERNAL);
		$body=trim($body);
		if( !empty($body) ) {
			// タイプによってエンコード変更
			switch( $encoding ) {
				case 0 :
					$mail[$mailno]['body']=mb_convert_encoding($body, "UTF-8", $charset);
				break;
				case 1 :
					$encode_body=imap_8bit($body);
					$encode_body=imap_qprint($encode_body);
					$mail[$mailno]['body']=mb_convert_encoding($encode_body, "UTF-8", $charset);
				break;
				case 3 :
					$encode_body=imap_base64($body);
					$mail[$mailno]['body']=mb_convert_encoding($encode_body, "UTF-8", $charset);
				break;
				case 4 :
					$encode_body=imap_qprint($body);
					$mail[$mailno]['body']=mb_convert_encoding($encode_body, 'UTF-8', $charset);
				break;
				case 2 :
				case 5 :
				default:
					// エラー処理を記述...
				break;
			}
		}else{
			// エラー処理を記述...
		}
		
		// 添付を取得
		if( !empty($attached_data) ) {
			foreach( $attached_data as $key => $value) {
				$attached=imap_fetchbody($mbox, $mailno, $key+1, FT_INTERNAL);
				if(empty($attached)) break;
				// ファイル名を一意の名前にする(同じファイルが存在しないように)
				list($name, $ex)=explode('.', $value['file_name']);
				$mail[$mailno]['attached_file'][$key]['file_name']=$name.'_'.time().'_'.$key.'.'.$ex;
				$mail[$mailno]['attached_file'][$key]['image']=imap_base64($attached);
				$mail[$mailno]['attached_file'][$key]['content_type']='Content-type: image/'.strtolower($value['content_type']);
			}
		}

		// メールの削除
		imap_delete($mbox, $mailno);
	}
	// 削除用にマークされたすべてのメッセージを削除
	imap_expunge($mbox);

	// $mailを確認
	var_dump( $mail );
}

Wordpressでプラグインを使わずにtwitterへ自動ツイートを実装してみる

TwitterOAuthライブラリ を使用している
ライブラリ使用方法の参考記事:PHP+OAuthでTwitter

TwitterへOAuthクライアントの登録

TwitterにOAuthアプリケーション情報を登録。アプリケーション登録等の手順は割愛。
Twitter Applications | dev.twitter.com

Twitterに過去記事を自動POSTする機能を実装

仕様

登録されている記事からランダムで1件取得しツイートするシステム
現在、期間指定などしていない
ツイートの間隔は、6時間に1ツイート

ライブラリのダウンロード

TwitterOAuthライブラリを以下の場所へ保存

/path/to/wordpress/themes/example/libs/components/
自動ツイートまで

→ クローンで実行されるファイル

ツイッターへPOSTを実行するクラス

  • /path/to/wordpress/themes/example/libs/components/twitteroauth/twitteroauth.php

Twitter OAuth ライブラリ本体

tweet_post_cron.php

<?php
// wordpress関数を使用できるように読み込む
require_once('/home/www/htdocs/zukunasi.net/wp-load.php');
// ツイッターへのポストを実行するクラスを読み込む
require_once (get_theme_root() . '/' . get_template() . '/libs/twitter.class.php');
// 短縮URLを取得するクラスを読み込む
require_once (get_theme_root() . '/' . get_template() . '/libs/bitly.class.php');

$twitter=new TwitterClass();       
$bitly=new BitlyClass();           

// query...                        
global $wpdb;                      
$query="select ID, post_title from wp_posts where post_status = 'publish' and post_type = 'post' order by rand() limit 1;";
$post=$wpdb->get_row($query);
$before='[過去記事]:';            
$url=get_permalink($post->ID);
// bit.ly api...
$url=$bitly->__createShortUrl($url);
$string=$before.$post->post_title.' - '.$url;
if( strlen($string) > 140 ) {      
    mb_substr($string, 0, 140);    
} 
// tweet...
$twitter->__tweet($string);

twitter.class.php

<?php
// 設定ファイルを読み込む
require_once (get_theme_root() . '/' . get_template() . '/config.php');
// Twitter OAuth ライブラリを読み込む
require_once (get_theme_root() . '/' . get_template() . '/libs/components/twitteroauth/twitteroauth.php');
class TwitterClass {

    var $twitter;

    function __construct() {
        $this->twitter=new TwitterOAuth(
            TWITTER_CONSUMER_KEY,
            TWITTER_CONSUMER_SECRET,
            TWITTER_ACCESS_TOKEN_KEY,
            TWITTER_ACCESS_TOKEN_SECRET
        );
    }

    function __tweet($string) {
        return $this->twitter->OAuthRequest(
            "http://api.twitter.com/1/statuses/update.xml",                                                                                                                                   
            "POST",
            array("status"=>$string)
        );  
    }   
}

最後にクーロンを設定して完了。