WordPress プラグインとテーマの相性 (グローバル変数の罠)

2010-4-11 02:08
このエントリーをはてなブックマークに追加

WordPress の海外製テーマを適用すると、あるプラグインが動作しなくなるので調べていたら以下のようなことが分かりました。

このプラグインは shutdown のアクションフックで、ページの出力後に処理をしています。このプラグインはグローバル変数 $id を参照していて、単一ページの場合はここに表示されている記事の ID がセットされてくると言う前提で動作しています。ところがこの $id が常に別の記事IDになってしまうのです。

この現象が発生するのは特定のテーマのみでした。調べてみるとそのテーマでは sidebar.php 上で以下のような処理をしていました。

<ul>
    <?php query_posts('showposts=10'); ?>
    <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
    <li><a href="<?php the_permalink() ?>"><?php the_title() ?></a></li>
    <?php endwhile; endif; ?>
</ul>

サイドバーに最近の投稿を表示するために独自でコードを書いているようですが、この部分で the_post を呼び出していますが、ここでグローバル変数の $id が上書きされてしまい、10件のリストアップされたうちの最後の投稿IDを格納していました。

上記の部分は the_post を使わずに、get_archives API でもっと簡潔に書けますので変更します。

<ul>
    <?php get_archives('postbypost', '10', 'custom', '<li>', '</li>'); ?>
</ul>

これによりコードが簡潔になる上、グローバル変数の上書きも解消され、プラグインの動作も戻りました。まあ、グローバル変数には PHP に限らずやはり悩まされます。

プラグイン側では shutdown にアクションフックをかけた場合は、引数で $post を受け取れないのでグローバル変数を使わざるを得ないのですよね。get_sidebar へのフックにすればサイドバーが呼び出される直前に動作しますが、サイドバーが複数あるテーマだと get_sidebar が複数回呼ばれる可能性がありますし……。

コメントはまだありません

No comments yet.

Sorry, the comment form is closed at this time.

34 queries. HTML convert time: 0.990 sec. Powered by WordPress. Valid XHTML
Copyright © 2003-2017 @ futuremix.org ログイン