0

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 でエラーを発生させた配列ではありません

4

0 に答える 0