web-dev-qa-db-ja.com

投稿から短いコードの属性を取得する方法を教えてください。

メインページ(およびカテゴリページ)でNextGenギャラリーをプレビューして、通常表示される投稿のテキストの横にメインページのギャラリーの単一の画像を表示しようとしています。ギャラリーIDを指定してギャラリーから画像を取得するPHPの例を見つけました。私のループの中に私は現在の投稿があります。私が理解できないのは、投稿を受けて[nggallery]ショートコードの属性を取得する方法です。

言い換えれば、NextGENギャラリーを持つそれぞれの投稿に対して、私はidコードからショートコードを取得する必要があります。たとえば、投稿に[nggallery id=50]が含まれている場合は、値50が必要です。

投稿からその情報を取得する方法を教えてください。

私は次世代のプラグインのソースコードで解決策を見つけたいと思っていましたが、もちろんそのコードは短いコードハンドラを登録してWPにそれらをコールバックさせます。彼らのショートコードを探すために彼らが投稿を解析するところで彼らのソースコードに例はありません。

2
Ian Lelsie

解決策を見つけました。 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.phploop-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ギャラリー オブジェクトへのアクセスに関する別の回答からの情報を利用します。

1
Ian Lelsie

あなたの解決策は私が特定のショートコードの属性を取得するという私自身の問題に対する答えを見つけるのを助けてくれました、しかし私はあなたのアプローチに問題があるかもしれないことを恐れています。

あなたはpreg_matchをチェックするためにpost_contentを使っています。複数のショートコードが含まれている投稿がある場合、最初のもののみが返されます。これは、探しているものとは異なる場合があります。

代わりに、preg_match_allを使用してから、regex_matches配列をループして、必要なショートコードを確認してください。

また、文字列から引用符を削除するためにstr_replaceを使用する必要はありません。 Wordpressは組み込み関数shortcode_parse_attsを持っています。これは引数の文字列(あなたの場合は$regex_matches[3])を引数として取り、配列を出力します。これにより、wp_parse_args関数を使用する必要もなくなります。

2
Andrei G.