メインページ(およびカテゴリページ)でNextGenギャラリーをプレビューして、通常表示される投稿のテキストの横にメインページのギャラリーの単一の画像を表示しようとしています。ギャラリーIDを指定してギャラリーから画像を取得するPHPの例を見つけました。私のループの中に私は現在の投稿があります。私が理解できないのは、投稿を受けて[nggallery]ショートコードの属性を取得する方法です。
言い換えれば、NextGENギャラリーを持つそれぞれの投稿に対して、私はidコードからショートコードを取得する必要があります。たとえば、投稿に[nggallery id=50]
が含まれている場合は、値50
が必要です。
投稿からその情報を取得する方法を教えてください。
私は次世代のプラグインのソースコードで解決策を見つけたいと思っていましたが、もちろんそのコードは短いコードハンドラを登録してWPにそれらをコールバックさせます。彼らのショートコードを探すために彼らが投稿を解析するところで彼らのソースコードに例はありません。
解決策を見つけました。 I の周りを検索してたくさんのコードを見つけた後 それは投稿の中に特定の短いコードがあるかどうかを決定します。
そのコードはまた、パラメータをショートコードに解析しようとします。ギャラリーIDが欲しいので、これは良いことです。掲載されているコードにはいくつか問題がありましたので、調整しました。これは投稿内で短いコードを見つけてそのパラメータを取得するコードです。
<?php // Look for a NextGEN gallery
$galleryID;
$previewIndex = 1;
$regex_pattern = get_shortcode_regex();
preg_match ('/'.$regex_pattern.'/s', $post->post_content, $regex_matches);
if ($regex_matches[2] == 'nggallery') :
// Found a NextGEN gallery find out what ID
// Turn the attributes into a URL parm string
$attribureStr = str_replace (" ", "&", trim ($regex_matches[3]));
$attribureStr = str_replace ('"', '', $attribureStr);
// Parse the attributes
$defaults = array (
'preview' => '1',
);
$attributes = wp_parse_args ($attribureStr, $defaults);
if (isset ($attributes["id"])) :
$galleryID = $attributes["id"];
endif;
if (isset($attributes["preview"])) :
$previewIndex = $attributes["preview"];
endif;
endif;
?>
微調整が必要なのは、パラメータの処理でした。いくつかの秘密の憲章の代わりにtrimを使用し、ショートコードパラメータを正しく処理するためにwp_parse_args
に切り替える。上記のコードがWPループ内で実行を終了すると、$galleryID
はNextGENギャラリーIDを保持し、previewIndex
はプレビューインデックスに設定されます。または、previewIndex
属性が存在しない場合は1が設定されます。
previewIndex
は、ギャラリーのプレビューに使用するサムネイルを示すために私が "追加"した属性です。 NextGENはそれを無視し、ギャラリーは通常通りにレンダリングしますが、今度はプレビューエントリに特定のアイコンを表示するために私のテーマにそれを使うことができます。
これが私のloop-index.php
とloop-category.php
のギャラリープレビューの作成を処理するコードです。
<?php /* Enhance the content preview with an image from the NextGEN gallery */ ?>
<?php
global $nggdb;
$gallery = $nggdb->get_gallery ($galleryID, 'sortorder', 'ASC', true, 0, 0);
$image = $gallery[$previewIndex];
$total_images = count ($gallery);
?>
<?php if (isset($image) && isset($image->thumbURL)) : ?>
<?php /* Show the thumbnail */ ?>
<a href="<?php the_permalink(); ?>" title="<?php printf( esc_attr__( 'Permalink to %s', 'twentyten' ), the_title_attribute( 'echo=0' ) ); ?>" rel="bookmark">
<img class="entry-preview-image" src="<?php echo $image->thumbURL ?>" align="left" />
</a>
<?php endif; ?>
<?php /* Show the text excerpt */ ?>
<?php the_excerpt(); ?>
<?php /* Show the statement of number of images contained */ ?>
<em><?php printf( _n( 'This gallery contains <a %1$s>%2$s photo</a>.', 'This gallery contains <a %1$s>%2$s photos</a>.', $total_images, 'twentyten' ),
'href="' . get_permalink() . '" title="' . sprintf( esc_attr__( 'Permalink to %s', 'twentyten' ), the_title_attribute( 'echo=0' ) ) . '" rel="bookmark"',
number_format_i18n( $total_images )); ?>
</em>
<?php endif; ?>
これは、ギャラリー内のサムネイルと画像の数を取得するために、 NextGENギャラリー オブジェクトへのアクセスに関する別の回答からの情報を利用します。
あなたの解決策は私が特定のショートコードの属性を取得するという私自身の問題に対する答えを見つけるのを助けてくれました、しかし私はあなたのアプローチに問題があるかもしれないことを恐れています。
あなたはpreg_match
をチェックするためにpost_content
を使っています。複数のショートコードが含まれている投稿がある場合、最初のもののみが返されます。これは、探しているものとは異なる場合があります。
代わりに、preg_match_all
を使用してから、regex_matches
配列をループして、必要なショートコードを確認してください。
また、文字列から引用符を削除するためにstr_replace
を使用する必要はありません。 Wordpressは組み込み関数shortcode_parse_atts
を持っています。これは引数の文字列(あなたの場合は$regex_matches[3]
)を引数として取り、配列を出力します。これにより、wp_parse_args
関数を使用する必要もなくなります。