如何从帖子中获取短代码的属性?

时间:2012-06-28 作者:Ian Lelsie

我正在尝试预览主页(和分类页)上的下一个图库,以便在主页上的图库中的单个图像旁边显示通常显示的帖子文本。我找到了一些PHP示例,这些示例可以从给定库ID的库中获取图像。在我的循环中,我有一篇最新的帖子。我搞不懂的是,在一篇帖子中,如何获取[nggallery]短代码的属性。

换言之,对于每个带有NextGEN库的帖子,我需要从简短代码中获得id值。例如,如果帖子包含[nggallery id=50] 我需要价值50.

我如何从帖子中获得这些信息?

我希望在下一代插件的源代码中找到解决方案,但当然,该代码注册了一个简短的代码处理程序,并允许WP调用它们。在他们的源代码中,没有任何示例可以让他们解析一篇文章来寻找他们的短代码。

3 个回复
最合适的回答,由SO网友:Ian Lelsie 整理而成

我找到了解决办法。经过一系列的搜索,我found some code 它确定帖子中是否包含特定的短代码。

该代码还尝试将参数解析为短代码。这很好,因为我需要库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 将保存下一个画廊ID和previewIndex 将设置为预览索引,如果没有,则设置为1previewIndex 属性存在。

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 gallery 对象,以获取库中的缩略图和图像计数。

SO网友:Andrei G.

您的解决方案帮助我找到了自己的问题的答案,即获取某个短代码的属性,但我担心您的方法可能存在问题。

您正在使用preg_match 检查post_content, 只返回1个匹配项。如果您的帖子中有多个短码,它将只返回第一个短码,而这可能不是您要查找的短码。

相反,您应该使用preg_match_all, 然后通过regex_matches 数组来检查所需的短代码。

此外,您不需要使用str_replace 从字符串中删除引号。Wordpress具有内置功能shortcode_parse_atts 这需要一系列参数(在您的情况下是$regex_matches[3]) 并输出一个数组。这也将使您不必使用wp_parse_args 作用

SO网友:Hasan Uj Jaman

无论哪种方式,你都可以很容易地做到。首先钩住一个函数。我用的是wp\\U head,但你可以用任何你想要的人。

add_action( \'wp_head\', \'find_shortcode_attribute\' );

function find_shortcode_attribute() {
global $post;

if( has_shortcode( $post->post_content, \'nggallery\' ) ) {
    preg_match_all( \'/\' . get_shortcode_regex() . \'/\', $post->post_content, $matches, PREG_SET_ORDER );

    echo "<pre>";
    print_r( $matches );
    echo "</pre>";

    // you will get the attribute on $matches[3]
    // do whatever you want here.

}

结束

相关推荐

如何用显式样式版本替换GET_TEMPLATE_PART(‘loop’,‘tag’)?

所以我的主题有一个标签。php,其中包含以下行:get_template_part(\'loop\',\'tag\');它运行循环并输出标记条目。我正在修改它以包含帖子缩略图(使用if(has\\u post\\u thumbnail()){the\\u post\\u thumbnail()}),但需要添加更多样式。为此,我需要访问get_template_part() 正在吐。我知道我应该能够通过创建自己的循环中循环标记来实现这一点。php或类似的东西,但找不到示例。有人能给我一个简单的循环标记示例吗

如何从帖子中获取短代码的属性? - 小码农CODE - 行之有效找到问题解决它

如何从帖子中获取短代码的属性?

时间:2012-06-28 作者:Ian Lelsie

我正在尝试预览主页(和分类页)上的下一个图库,以便在主页上的图库中的单个图像旁边显示通常显示的帖子文本。我找到了一些PHP示例,这些示例可以从给定库ID的库中获取图像。在我的循环中,我有一篇最新的帖子。我搞不懂的是,在一篇帖子中,如何获取[nggallery]短代码的属性。

换言之,对于每个带有NextGEN库的帖子,我需要从简短代码中获得id值。例如,如果帖子包含[nggallery id=50] 我需要价值50.

我如何从帖子中获得这些信息?

我希望在下一代插件的源代码中找到解决方案,但当然,该代码注册了一个简短的代码处理程序,并允许WP调用它们。在他们的源代码中,没有任何示例可以让他们解析一篇文章来寻找他们的短代码。

3 个回复
最合适的回答,由SO网友:Ian Lelsie 整理而成

我找到了解决办法。经过一系列的搜索,我found some code 它确定帖子中是否包含特定的短代码。

该代码还尝试将参数解析为短代码。这很好,因为我需要库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 将保存下一个画廊ID和previewIndex 将设置为预览索引,如果没有,则设置为1previewIndex 属性存在。

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 gallery 对象,以获取库中的缩略图和图像计数。

SO网友:Andrei G.

您的解决方案帮助我找到了自己的问题的答案,即获取某个短代码的属性,但我担心您的方法可能存在问题。

您正在使用preg_match 检查post_content, 只返回1个匹配项。如果您的帖子中有多个短码,它将只返回第一个短码,而这可能不是您要查找的短码。

相反,您应该使用preg_match_all, 然后通过regex_matches 数组来检查所需的短代码。

此外,您不需要使用str_replace 从字符串中删除引号。Wordpress具有内置功能shortcode_parse_atts 这需要一系列参数(在您的情况下是$regex_matches[3]) 并输出一个数组。这也将使您不必使用wp_parse_args 作用

SO网友:Hasan Uj Jaman

无论哪种方式,你都可以很容易地做到。首先钩住一个函数。我用的是wp\\U head,但你可以用任何你想要的人。

add_action( \'wp_head\', \'find_shortcode_attribute\' );

function find_shortcode_attribute() {
global $post;

if( has_shortcode( $post->post_content, \'nggallery\' ) ) {
    preg_match_all( \'/\' . get_shortcode_regex() . \'/\', $post->post_content, $matches, PREG_SET_ORDER );

    echo "<pre>";
    print_r( $matches );
    echo "</pre>";

    // you will get the attribute on $matches[3]
    // do whatever you want here.

}

相关推荐

Generating a perfect loop

所以我现在已经在这里坐了大约三个小时了,我不得不让这件事过去几个小时来好好睡一觉,同时我希望能得到你的帮助。我已经能够使用$wpdb->get\\u results从数据库中获取内容,并且能够将它们放入一个数组中,但是我想使用这些信息在循环中运行一个新的查询,以获取列表中的多个项目。我使用了本指南的一个变体https://stackoverflow.com/questions/45848249/woocommerce-get-all-orders-for-a-product 获取订单ID。现在,我已