0

WordPress のサイトに表示する外部データを取得するために、php スクリプトを使用しています。これは1年間問題なく機能していましたが、フロントページのいくつかの要素を再配置する必要があったとき、ループ内の投稿のサムネイルが突然表示されなくなりました.

いくつかの調査の後、ループの後にphpスクリプトを含めると投稿のサムネイルが表示されますが、ループのに含めると投稿のサムネイルが神秘的に消えることがわかりました。

PHPログにはヒントがありません.Wordpressは、ループの前にスクリプトが含まれている場合、投稿サムネイルブロックにHTMLを生成しません.

なぜこれが起こるのか誰にも考えがありますか?そして、どうすればそれを回避できますか?

(追伸。ループの前にスクリプトを含める必要がある理由は、スタイリング/css の問題です。ループの後にスクリプトを機能させるために CSS をハッキングすることはできると思いますが、問題の原因を突き止めたいと思います。)

コードは次のとおりです。

投稿のサムネイルが表示されるはずの私のindex.php(これは機能しません):

<!-- ### This includes the php script, and works if it's placed bellow the loop/#leftcontent ### -->
<div id="rightcontent">
    <?php include("rightcontentreleases.php"); ?>
</div>



<!-- ### Standard wordpress loop ### -->
<div id="leftcontent">

    <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

           <div class="post">

                    <h2 class="posttitle"><a 
                        href="<?php the_permalink() ?>" 
                        rel="bookmark" 
                        title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></h2>


                        <!-- ### The post thumbnail ### -->
                        <a href="<?php the_permalink() ?>" ><?php if (has_post_thumbnail()) {the_post_thumbnail();}?></a>



                    <div class="entry">
                        <?php the_excerpt(); ?><a class="readmore" href="<?php the_permalink() ?>">Read more</a>
                    </div>

            </div><!-- .post -->

 <?php endwhile; else: ?><p>Sorry, no posts matched your criteria.</p><?php endif; ?>

</div><!-- #leftcontent -->

これは機能します:

<!-- ### Standard wordpress loop ### -->
    <div id="leftcontent">

        <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

               <div class="post">

                        <h2 class="posttitle"><a 
                            href="<?php the_permalink() ?>" 
                            rel="bookmark" 
                            title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></h2>


                            <!-- ### The post thumbnail ### -->
                            <a href="<?php the_permalink() ?>" ><?php if (has_post_thumbnail()) {the_post_thumbnail();}?></a>



                        <div class="entry">
                            <?php the_excerpt(); ?><a class="readmore" href="<?php the_permalink() ?>">Read more</a>
                        </div>

                </div><!-- .post -->

     <?php endwhile; else: ?><p>Sorry, no posts matched your criteria.</p><?php endif; ?>

    </div><!-- #leftcontent -->



    <!-- ### This includes the php script, and works if placed after the loop like this ### -->
    <div id="rightcontent">
        <?php include("rightcontentreleases.php"); ?>
    </div>

外部スクリプトは、外部データベースを単純にループし、標準的な html を表示します。

<?php // this script connects to the external database, and defines some functions fetching the data ?>
<?php include_once("tigernet.php"); tigernetmysql(); get3upcoming(); ?>


<?php if (mysql_fetch_assoc($resultupcoming) > 0): ?>
<div class="rightcontentreleases" id="upcomingreleases">
<h2 class="head">Upcoming Releases</h2>

<?php while ($row = mysql_fetch_assoc($resultupcoming)) { ?>
<div class="onelatestrelease">
    <a href="<?php bloginfo( 'wpurl' ); ?>/releases"><img class="albumartwork" src="http://media.tigernet.no/images/item/full/<?= $row["code"] ?>.jpg" /></a>
    <h2 class="artist"><?= $row["artist"] ?></h2><br/>
    <h3 class="title"><?= $row["title"] ?></h3><br/>
    <?php if (isset($row['url'])): ?><div class="soundcloudplayer_right">
            <object height='18'><param name='movie'value='http://player.soundcloud.com/player.swf?url=<?= $row['url'] ?>&auto_play=false&player_type=tiny&show_duration=false&show_user=false&show_playcount=false&font=Arial&color=92140e'>
                                <param name='allowscriptaccess' value='always'> 
                                <param name='wmode' value='transparent'>
                                <embed wmode='transparent' allowscriptaccess='always' height='18' src='http://player.soundcloud.com/player.swf?url=<?= $row['url'] ?>&auto_play=false&player_type=tiny&show_duration=false&show_user=false&show_playcount=false&font=Arial&color=92140e' type='application/x-shockwave-flash'>
                                </object>
    </div><?php endif; ?>
</div><!-- .onelatestrelease -->
<?php } ?>

</div><!-- #latestreleases -->
<?php endif; ?>
4

1 に答える 1

0

何らかの方法で、にrightcontentreleases.php応答するデータベースオブジェクトを台無しにしている必要がありますhave_posts()。正しいことはhave_posts()、これが発生する理由と場所を調べて確認することです。

または、回避策を採用することもできます。

<?php ob_start(); ?>
<!-- ### Standard wordpress loop ### -->';
<div id="leftcontent">
...
</div><!-- #leftcontent -->
<?php $leftContent = ob_get_clean(); ?>
<div id="rightcontent">
<?php include("rightcontentreleases.php"); ?>
</div>
<?php print $leftContent; unset($leftContent); ?>

これは基本的に標準ループを実行し、出力をに保存します$leftContent。つまり、「すべてが機能する」と説明した状況にあります。

次に、rightcontentを実行します。これも機能し、他の何よりも先にrightcontentを出力します。

最後に、を出力します$leftContent。これは、この時点では、何も混乱させることができない不活性なHTMLです。

ただし、これは回避策であることを忘れないでください。簡単なセットアップで動作します。より複雑な設定はまだ機能せず、実際の問題がどこにあるかを調査する必要があります。

サムネイルが表示されない理由はhave_posts()、新しいコンテンツブロックの後で関数が呼び出された場合、関数が突然FALSEを返すためだと思います。代わりにエラーが発生した場合は、アプリケーションのログを調べて、エラーが見つからない場合は、このエラーが報告されない理由を理解する必要があります。しかし、今のところ、エラーはなく、問題が発生している場所をすばやく見つける必要があると仮定しましょう。

これを行うには、コードにこのような行を含めることで、別のハックを試すことができます

 have_posts() or die("SOMETHING JUST CLEARED MY POSTS!");

...最初に配置してもトリガーされず、投稿が出力されることはわかっています。また、2つのブロックを反転すると、その線がトリガーされることもわかっています。

したがって、コンテンツを生成するコード内でその行を上から順に移動すると、トリガーされる場所がわかります。直前の操作は明らかにあなたの投稿フラグに何かをしました(多分DB接続を閉じることなどによって)。それが何をしたかを発見したら、問題を回避する方法の計画を開始できます。

于 2013-02-27T10:47:35.800 に答える