PHP関連

ページのスラッグからデータを引き出す方法【WordPress】

get_page_by_path("スラッグ名");

で、そのスラッグ名のページ(固定ページ)を取得できます。

第3引数をpostとすれば、「投稿」から取得できます。

get_page_by_path("スラッグ名", "OBJECT", "post");

なお、固定ページで、親ページが設定されている場合、親ページのスラッグも含める必要があります。

get_page_by_path("親ページのスラッグ名/スラッグ名");

だから、やっぱり正確にはスラッグ名ではないんですね。

 

参考サイト

get_page_by_path:WordPress私的マニュアル

nandani | 2014年11月24日 | コメント(0) | トラックバック(0) | CMS関連 | PHP関連

WordPressでTinyMCEの入力フィールドを作る場合

任意の場所に、Wordpressの内容入力フィールドと同じようにリッチテキストエディタ(TinyMCE)を設置する方法は、

wp_editor( "(内容)", '(ID)');

で、設置できます。

第3引数に細かい設定ができますが、(ID)をnameと同じにしていればこれだけでもOKです。

プラグインなしでカスタムフィールド作ってた際(functions.phpに直書き)どうやったらリッチテキストエディタになるのか、かなり苦戦したのでメモ。

参考サイト

wp_editor:WordPress私的マニュアル

 

nandani | 2014年11月12日 | コメント(0) | トラックバック(0) | CMS関連 | PHP関連

Postgresqlはテーブル名に注意

Postgresqlでテーブルを作った後、PHPにてSQL

SELECT * FROM (テーブル名)

と実行したのですが、存在するテーブルなのに、

ERROR:  relation "(テーブル名)" does not exist

というエラーが出てしまいました。

調べてみると、どうやらテーブル名はダブルクォートでくくらなければならないらしい。

SELECT * FROM "(テーブル名)"

ただし、これはテーブル名に大文字が含まれている場合のみで、小文字のみであればダブルクォートは不要とのこと。

たしかに、テーブル名は大文字で作成してました。

なんならSQLを実行した後、エラーで表示されるテーブル名が小文字になっているから、おかしいなとは思っていたのですが。

Postgresqlの場合は、実行時にテーブル名が小文字になってしまうのかな?

だから、大文字を含む際はダブルクォートが必要なのか。

 

参考サイト

PostgreSQLのテーブル名はダブルクォート有無で別名になった. - それマグで!

nandani | 2014年10月08日 | コメント(0) | トラックバック(0) | DB関連 | PHP関連

SuPHP使ってるときはphp.confいらないよ

手間取ったのでメモ。

PHPのバージョンをアップしたところ、PHPがモジュールモードになってしまい、実行権限がapacheになってしまいました。(もともとSuPHPを使っていたので、実行権限はユーザごとになっていた。SuPHPを使うためには、PHPをCGIモードにする必要がある。)

CGIモードにするには、ということでいろいろ調べてphp.confをいじりまくったのですが、全然CGIモードにならない!

効いていないわけではないっぽいけど、やっぱりモジュールモードのままで散々手こずったのですが、FTPで/etc/httpd/conf.d/フォルダを除いてみたところ、一発で解決しました。

そこにあったのは「mod_suphp.conf」

こいつだけでよかったのです。

「php.conf」なんていらなかったのです。

多分バージョンアップしたときに、勝手にできたのでしょう。

「php.conf」をリネームし、無効化してから、Apache再起動したところ、無事CGIモードに切り替えることができました。

あ~あ・・・・

ちなみに、PHPがモジュールモードかCGIモードかを見極める方法は、phpinfoの「Server API」を確認すればOKです。

ここが、「CGI/FastCGI」ならCGIモード、「Apache 2.0 Handler」ならモジュールモードです。

 

htmlspecialcharsに注意【PHP】

今更な話題ですが、詰まったのでメモ。

PHPが5.3から5.5に変わった途端、フォームにて日本語がPOSTされるとまるごと消えてしまう現象が発生しました。(ちなみにそのサイトはEUC-JPで作成されていました)

この現象はWordpressなどでもあったので、

default_charset
mbstring.internal_encoding

あたりの仕業だろうと思っていたのですが、これらはコメントアウトされている。(つまり特定の文字コードに設定されていない)

phpinfoを見てもおかしなところは全然見当たらない。

ということでいろいろ調べてみると、なんとhtmlspecialcharsが原因であることが判明しました。

このhtmlspecialcharsはもともとは、「ISO-8859-1」がデフォルト文字コードで変換がされていたのですが、PHP5.4から「UTF-8」がデフォルトになったとのこと。

しかも、php.iniで設定されている文字コードに準拠してくれればよいのですが、これはちゃんと設定してあげないと、強制的に「UTF-8」が使用されてしまうらしい。(第3引数をクォートなどで任意に空にしてあげれば準拠してくれるらしい。でも、第3引数をなにも設定してないとUTF-8となる。なんでやねん)

ということで、簡単な方法はないかを探していたけど、やっぱり引数をつけてあげるしかないみたい・・・

htmlspecialchars($hoge, ENT_COMPAT | ENT_HTML401, "ISO-8859-1");

参考サイト

htmlspecialchars()を使うと文字が消える? | PHP Archive

[PR]WAFの導入はHASHコンサルティング Sturts1 / Struts2 の脆弱性にも対応

nandani | 2014年09月23日 | コメント(0) | トラックバック(0) | PHP関連

固定ページの子ページを表示するショートコード【WordPress】

開いた固定ページの子ページが、自動的にリスト表示されるようにしたい場合、wp_list_pagesをショートコードにしてしまうと便利です。

functions.phpに下記を追記します。

function pageChild() {
	global $post;
	
	$args = array('depth'        => 0,
		'show_date'    => NULL,
		'date_format'  => get_option('date_format'),
		'child_of'     => $post->ID,
		'exclude'      => NULL,
		'include'      => NULL,
		'title_li'     => '',
		'echo'         => 0,
		'authors'      => NULL,
		'sort_column'  => 'menu_order, post_title',
		'link_before'  => '',
		'link_after'   => '',
		'exclude_tree' => '' ); 
	
	$return = '<ul class="page_child">';
	$return .= wp_list_pages($args);
	$return .= '</ul>';
	
	return $return;
}
add_shortcode('page_child', 'pageChild');

子ページ持ちの固定ページに

[page_child]

と記述すると、その子ページがリスト表示されるようになります。

関数自体はなんてことないものですが、ショートコードって便利ですね。

nandani | 2014年06月11日 | コメント(0) | トラックバック(0) | CMS関連 | PHP関連

Facebookページのタイムラインを取得する方法

Facebookページのタイムラインを取得する方法のメモ。

タイムラインは以前紹介したアルバムや写真を取得する方法よりも、ひと手間かかります。(アクセストークンを取得する必要があるため)

プログラムは下記の通り。


<?php
/*
facebookページのタイムラインを取得する
*/

$facebook_page_id = '...';    //FacebookページのID
$access_token = '...';        //アクセストークン
$url = "https://graph.facebook.com/".$facebook_page_id."/feed?access_token=".$access_token;
$res = file_get_contents($url);
$data_array = json_decode($res, TRUE);

if(!empty($data_array["data"])){
print_r($data_array["data"]);
}
?>

 

○「$facebook_page_id」には、FacebookページのIDを代入してください。

IDはFacebookページを開いたときのURL「https://www.facebook.com/〇〇〇〇」の○○○○部分か、もしくは「https://www.facebook.com/pages/□□□□/○○○○?ref=hl」の○○○○部分。

※前者の例
https://www.facebook.com/FacebookJapan
の場合は「FacebookJapan」

※後者の例
https://www.facebook.com/pages/ダリの雑記/12345678901234567?ref=hl
の場合は「12345678901234567」(こんなURLはありませんがw)

 

○「$access_token」には、アクセストークンを代入します。

アクセストークンの取得方法は、以下の通り。

  1. https://developers.facebook.com/apps にアクセスし、「新しいアプリを作成」からアプリを作成します。(アプリ作成と言っても、ほぼアプリ名を重複しないように決めるだけ)
  2. アプリを作成すると、基本設定画面にて「App ID」と「App Secret」が取得できます。
    WS000282
  3. 「App ID」と「App Secret」を下記のURLに代入し、アクセスします。
    https://graph.facebook.com/oauth/access_token?client_id=(App ID)&client_secret=(App Secret)&grant_type=client_credentials
  4. アクセスすると、
    WS000283
    という風に表示されます。これがアクセストークンです。
    この値を「$access_token」に代入してください。

以上の2つを代入後、PHPを実行してください。

う~む。そのうちアルバムや写真もアクセストークンが必要になるのかな?

 

参考サイト

ソーシャルメディアAPIリファレンス - ウォールを取得する

Access Tokenを取得する

Graph API : Facebook開発者向けドキュメントの日本語訳とTips

nandani | 2013年10月22日 | コメント(0) | トラックバック(0) | API関連 | PHP関連

さくらインターネットに大容量のDBデータをインポートする

さくらインターネットに標準で用意されているphpMyAdminは、インポートするファイルの容量に限界があります(16MB)。

さてどうしたものか、sqlを実行するPHPプログラムでも作ってみるかと思ったのですが、・・・まてよ?

phpMyAdminをサーバのウェブ領域にアップして、そっちを使ったらいいんじゃね?

ってことで、phpMyAdminをダウンロードし、サーバにアップロードして試したところ普通にうまく行きました。

PHPのアップロードサイズはデフォルトでは数MB程度ですが、コントロールパネルの「PHP言語に関する設定>PHP設定の編集」で

memory_limit = 〇M
post_max_size = 〇M
upload_max_filesize = 〇M

と記述することにより、好きに設定できるので(限界はあると思いますが)インポートファイルの容量は(よほどでない限り)気にすることはありません。

インポートが完了したらアップしたphpMyAdminを削除して完了。

よかったよかった。

PHPで自分のつぶやきを取得する方法【API1.1】

やり方についてはほぼこちらのサイトを参考にしています。

PHP+OAuthでTwitter - SDN Project

  1. twitteroauthをダウンロードします。
  2. アプリ登録を行います。
    登録が完了するとアプリケーションの詳細画面になります。
    そこで「Consumer key」と「Consumer secret」が表示されますのでメモします。
  3. アプリケーション画面の下の方にある「Create my access token」ボタンをクリックします。
    処理後、ボタンの上の方に「Access token」と「Access token secret」が表示されますのでメモします。
  4. 下記のプログラムで自分のつぶやきを取得します。
<?php

//1.でダウンロードしたtwitteroauth.phpをinclude
require_once('./twitteroauth/twitteroauth.php');

//2.3.で取得した各キーを入力
$consumer_key = 'Consumer key';
$consumer_secret = 'Consumer secret';
$access_token = 'Access token';
$access_token_secret = 'Access token secret';

// OAuthオブジェクト生成
$to = new TwitterOAuth($consumer_key, $consumer_secret, $access_token, $access_token_secret);

// user_timelineの取得。TwitterからXML形式が返ってくる
$req = $to->OAuthRequest("https://api.twitter.com/1.1/statuses/user_timeline.json","GET",array("q"=>"dari_zakki", "count"=>"10"));

// Twitterから返されたJSONをデコードする
$results = json_decode($req);


echo '<ul>';
foreach($results as $value){
	echo '<li>';
	echo '<img src="'.$value->user->profile_image_url.'" /><br />';
	echo $value->text.'<br />';
	echo $value->user->name.'<br />';
	echo date("Y-m-d H:i:s", strtotime($value->created_at));
	echo '</li>';
}
echo '</ul>';
?>

これで自分がつぶやいたタイムラインを取得できます。

前に比べるとめんどくさくなりましたね。

まあ前が緩すぎたって話ではあるんですが^^;

 

参考サイト

PHP+OAuthでTwitter - SDN Project

PHPで『Twitter API 1.1』を使って、つぶやきの検索結果を取得したときのメモ | ユメミチ

nandani | 2013年06月20日 | コメント(0) | トラックバック(0) | API関連 | PHP関連

大容量のmp4ファイルをPHPで読み込んで出力する場合

数MBレベルのmp4ファイルならば

header('Content-type: video/mp4');
readfile("mp4ファイルのパス");
exit;

で十分対応できていたのですが、100MB越えのファイルになった際、「ファイルが壊れているため動画を再生できません。」という表示になってしまいました。

いろいろと調べた結果、readfileがダメとのこと。

記述を

header('Content-type: video/mp4');
$handle = fopen("mp4ファイルのパス", 'rb');  
while (!feof($handle))  
{  
	echo fread($handle, 4096);  
	ob_flush();  
	flush();  
}  
fclose($handle);
exit; 

と変更したところ、正常に再生されました。

ちなみにこれ、メモリによるみたいです。
ini_set("memory_limit","256M");
とPHPに記述しメモリ制限を増やしたところ、「readfile」でもうまく行きました(使用したファイルの容量は160MBです。)

でもこれはレンタルサーバによっては効かない場合もあるので、やっぱり後者の記述方法が確実かと思います。
※後者の場合ini_set("memory_limit","8M")でも正常に再生できました。

 

参考サイト

わくわくプログラミング自習室 Blogs Home

nandani | 2013年06月19日 | コメント(0) | トラックバック(0) | PHP関連

Copyright(c) 2010 - 2024 ダリの雑記