• 解決済 ikesu

    (@ikesu)


    最近になってショートコードの呼び出しに「Warning: Undefined variable」のエラーが発生するようになりました。ショートコードはウィジェットに、外部サイトrssの呼び出しとしてサイドバーに使用しています。

    エラー内容
    Warning: Undefined variable $maxitems in hoge.php on line 10

    Warning: Undefined variableのエラーは毎回ではなく、時々表示されます。

    「Warning: Undefined variable」は、指定している変数が定義されていない場合に発生するエラーだそうですが、毎回エラーになるわけではなくリロードすると改善(正常に表示)されることが多いため、PHPの記述が問題なのかがわからず、そもそも下記PHPに修正すべき場所がわからない状態です。

    下記の記述が現在のPHPにそぐわない場合、適切なPHPの記述を具体的に教えていただけませんでしょうか。

    phpの記述は下記になります。

    <div class="hoge01">
    <?php
    include_once(ABSPATH . WPINC . '/feed.php');
    $rss = fetch_feed('https://example.com/feed/atom/');
    if (!is_wp_error( $rss ) ) :
    $maxitems = $rss->get_item_quantity(4);
    $rss_items = $rss->get_items(0, $maxitems);
    endif;
    ?>
    <?php if ($maxitems == 0) echo 'リロードしてください.';
    else

    foreach ( $rss_items as $item ) : ?>
    <div class="hoge02">
    <a href='<?php echo $item->get_permalink(); ?>' target="_blank"><?php
    $first_img = '';
    if ( preg_match( '/<img.+?src=[\'"]([^\'"]+?)[\'"].*?>/msi', $item->get_content(), $matches ) ) {
    $first_img = $matches[1];
    }
    ?>
    <?php if ( !empty( $first_img ) ) : ?><img src="<?php echo esc_attr( $first_img ); ?>" alt="" style="width:150px;height:100px;"></a>
    </div>
    <?php endif; ?>
    <?php endforeach; ?>

    </div>
    <?php wp_reset_query(); ?>
    <br clear="all">
    <a href="https://example.com/" target="_blank">example.com</a>の更新RSS

    展開

    最近まではエラーになっておらず、検索でよくある原因に挙げられているPHPのバージョンは変更していません。複数のサーバー(サイト)で同じ状態になっています。

    最近行った更新は「WordPress6.7への更新」と「W3 Total Cacheの更新」と「その他プラグインの更新」くらいしか思いつきません。
    WordPress6.7をダウングレードしてみたり、W3 Total Cacheを一時的に停止してみても改善されません。

    現在は、「php.ini」によりエラー自体を表示しないようにしているのですが、根本的な解決をしたいと思っています。
    よろしくお願いします。

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • トピック投稿者 ikesu

    (@ikesu)

    複数のサーバー(サイト)で同じ状態になっています。

    と、上記で報告しましたが複数サイトのRSSを取得しているサイトについては
    「Warning: Undefined variable $maxitems in hoge.php 」のエラーは表示されず、何もなかった場合に表示される「No items.」だけが返されます。

    なので「php.ini」の「display_errors」はONのまま運営できていますが、RSSを取得・表示できない場合は同じような頻度で発生しています。

    複数RSSを表示しているコード

    <?php include_once(ABSPATH . WPINC . '/feed.php');
    $rss = fetch_feed(array(
    'https://example.com/feed/atom/',
    //RSSフィード1

    'https://example.com/feed/atom/',
    //RSSフィード2

    'https://example.com/feed/atom/'
    //RSSフィード3

    ));
    if (!is_wp_error( $rss ) ) :
    $rss->set_cache_duration(1800);
    $rss->init();
    $maxitems = $rss->get_item_quantity(6);
    $rss_items = $rss->get_items(0, $maxitems);
    date_default_timezone_set('Asia/Tokyo');
    endif;
    ?>
    <?php if ($maxitems == 0) echo '<li>No items.</li>';
    else
    foreach ( $rss_items as $item ) : ?>
    <div class="hoge01">
    <a href='<?php echo $item->get_permalink(); ?>' target="_blank"><?php
    $first_img = '';
    if ( preg_match( '/<img.+?src=[\'"]([^\'"]+?)[\'"].*?>/msi', $item->get_content(), $matches ) ) {
    $first_img = $matches[1];
    }
    ?>
    <?php if ( !empty( $first_img ) ) : ?><img src="<?php echo esc_attr( $first_img ); ?>" alt="" ></a>
    </div>
    <?php endif; ?>
    <?php endforeach; ?>

    phpのコード自体に問題があるのか、その他に原因があるのかすらわからない状態です。
    ご助言いただけませんでしょうか。

    よろしくお願いします。

    • この返信は12ヶ月前にikesuが編集しました。
    manbo

    (@manbo)

    エラーが表示されるサイトでデバッグモードが有効になっているから、そのサイトでエラーが表示されるのだと思います。
    また、if (!is_wp_error( $rss ) )でエラーの場合に、その後の$maxitemsが未定義になるのが原因です。

    以下ように$maxitems0を入れるようにすると<?php if ($maxitems == 0) echo 'リロードしてください.';に繋ぐ事が出来ますし$rss->get_item_quantity( 4 );で取得できなかった場合も変数の値は0になるのでリロードしてくださいのメッセージが表示されます。

    if ( !is_wp_error( $rss ) ):
        $maxitems = $rss->get_item_quantity( 4 );
        $rss_items = $rss->get_items( 0, $maxitems );
    else
        $maxitems = 0; 
    endif;

    個人的にはW3 Total Cacheが原因を引き起こしてるような気もします。
    W3 Total Cacheが有効の場合と無効の場合で$rssをdumpして変数の中身がどうなっているか何度か試せばはっきりすると思いますけど。

    トピック投稿者 ikesu

    (@ikesu)

    manboさん

    お返事ありがとうございます。
    サイト上にエラーが表示されないコードを教えてくださりありがとうございました。

    ただ、私にはうまく実装できず、ファイルを更新しようとすると
    「ファイルの9行目でエラーが発生したため、PHP コードの変更が適用されませんでした。修正して再度保存してください。」と表示されてしまいます。
    このコードでは誤りがあるのでしょうか?

    <div class="hoge01">
    <?php
    include_once(ABSPATH . WPINC . '/feed.php');
    $rss = fetch_feed('https://example.com/feed/atom/');
    if ( !is_wp_error( $rss ) ):
    $maxitems = $rss->get_item_quantity( 4 );
    $rss_items = $rss->get_items( 0, $maxitems );
    else
    $maxitems = 0;
    endif;
    ?>
    <?php if ($maxitems == 0) echo 'リロードしてください.';
    else

    foreach ( $rss_items as $item ) : ?>
    <div class="hoge02">
    <a href='<?php echo $item->get_permalink(); ?>' target="_blank"><?php
    $first_img = '';
    if ( preg_match( '/<img.+?src=[\'"]([^\'"]+?)[\'"].*?>/msi', $item->get_content(), $matches ) ) {
    $first_img = $matches[1];
    }
    ?>
    <?php if ( !empty( $first_img ) ) : ?><img src="<?php echo esc_attr( $first_img ); ?>" alt="" style="width:150px;height:100px;"></a>
    </div>
    <?php endif; ?>
    <?php endforeach; ?>

    </div>
    <?php wp_reset_query(); ?>
    <br clear="all">
    <a href="https://example.com/" target="_blank">example.com</a>の更新RSS

    また、W3 Total Cacheが原因である可能性があるとのことですので、設定を見直しした後に、「.htaccess」へ記載されていたW3 Total Cacheの記述を削除して様子見しています。

    よろしくお願いします。

    manbo

    (@manbo)

    失礼
    elseelse:にしてください。

    トピック投稿者 ikesu

    (@ikesu)

    ありがとうございます

    無事、ファイルを更新できました

5件の返信を表示中 - 1 - 5件目 (全5件中)

トピック「Warning: Undefined variableのエラーが発生する」には新たに返信することはできません。