smarty を使用している Web ページで最新の投稿を表示したいと考えています。スクリプトを見つけてどこかで変更しましたが、機能しませんでした。
テンプレート ファイルに、次のコードを挿入しました。
{sr_wpfeed var="someposts" wpsite="http://www.digins.nl/blog" num=3}
{foreach from=$someposts item=somepost}
<h2><a href="{$somepost.link}">
{$somepost.title}
</a>
</h2>
{$somepost.description}
<br>
{/foreach}
そこで、php ファイルにある関数 sr_wpfeed を呼び出します。
function smarty_function_sr_wpfeed($params, &$smarty) {
$required_params = array('var','wpsite', 'num');
foreach($required_params as $_key => $reqd_param) {
if (!isset($params[$reqd_param]))
$smarty->trigger_error("sr_wpfeed: required attribute '$reqd_param' not passed", E_USER_ERROR);
}
$var = '';
$wpsite = '';
$num = 0;
foreach($params as $_key => $_val) {
switch($_key) {
case 'wpsite':
case 'var':
if (!is_array($_val)) {
$$_key = $_val;
} else
$smarty->trigger_error("sr_wpfeed: '$_key' cannot be an array", E_USER_ERROR);
break;
case 'num':
if (!is_array($_val)) {
$$_key = (int)$_val;
if ($$_key < 0 || $$_key >25)
$smarty->trigger_error("sr_wpfeed: '$_key' not between 1 and 25", E_USER_ERROR);
} else
$smarty->trigger_error("sr_wpfeed: '$_key' cannot be an array", E_USER_ERROR);
break;
default:
$smarty->trigger_error("sr_wpfeed: attribute '$_key' not recognized", E_USER_NOTICE);
break;
}
}
//if(!$xml=simplexml_load_file($wpsite.'/feed') ){
// $smarty->trigger_error('Error reading XML file',E_USER_ERROR);}
$xml=simplexml_load_file($wpsite.'/feed');
$posts = array();
foreach($xml as $item){
for($i=0; $i<count($item->item); $i++){
if($i<$num){
$posts[] = array('link' => (string)$item->item[$i]->link
, 'title' => htmlentities($item->item[$i]->title,ENT_COMPAT, 'UTF-8')
, 'description' => $item->item[$i]->description
);
}
}
}
$smarty->assign($var, $posts);
}
xmlファイルに問題があると思います。simplexml_load_file 関数までは問題なく動作するようです。何か案は?
2 番目の問題は、trigger_error です。私のウェブサイトがハングします。
更新: 以下のエラー ログ:
Warning: simplexml_load_file() [function.simplexml-load-file]: http:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/vhosts/digins.nl/httpdocs/assets/includes/footer.inc.php on line 44
Warning: simplexml_load_file(http://www.digins.nl/blog/feed) [function.simplexml-load-file]: failed to open stream: no suitable wrapper could be found in /home/vhosts/digins.nl/httpdocs/assets/includes/footer.inc.php on line 44
Warning: simplexml_load_file() [function.simplexml-load-file]: I/O warning : failed to load external entity "http://www.digins.nl/blog/feed" in /home/vhosts/digins.nl/httpdocs/assets/includes/footer.inc.php on line 44
Warning: Invalid argument supplied for foreach() in /home/vhosts/digins.nl/httpdocs/assets/includes/footer.inc.php on line 47
Update2
curl を使用するように simplexml_load_file を変更しました。
$wpsite = $wpsite.'/feed';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $wpsite);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
$returned = curl_exec($ch);
curl_close($ch);
// $xml === False on failure
$xml = simplexml_load_string($returned);
私のテストWordPressには投稿が1つしかなかったので、最初はうまくいかないようです。その場合、$xml は foreach でエラーを発生させた配列ではありません