在另一个快捷码回调中调用快捷码

时间:2013-10-23 作者:zutto_shonen

我使用的插件只向特定的用户角色显示内容。此内容由一个快捷码标记包围,使其对其他用户角色不可见。现在,我想调用该受限内容中的其他短代码。

我知道我需要设置插件的短代码,以便它们使用do_shortcode(), 但文件太多了,我不知道该在哪里做。我试过的所有地方都没有改变。有什么建议吗?

这是我找到的代码块。我想这就是我需要编辑的内容。你觉得怎么样?更改此项:

return stripslashes($message);

更改为:

return stripslashes(do_shortcode($message));

// Show the level based protected shortcode message
    function do_levelprotected_shortcode($atts, $content = null, $code = "") {

        global $M_options;

        // Set up the level shortcodes here
        $shortcodes = apply_filters(\'membership_level_shortcodes\', array() );
        $notshortcodes = apply_filters(\'membership_not_level_shortcodes\', array() );

        $code = strtolower( $code );

        if( substr( $code, 0, 4 ) !== "not-" ) {
            if(!empty($shortcodes)) {
                // search positive shortcodes first
                $id = array_search( $code, $shortcodes );
                if($id !== false) {
                    // we have found a level so we need to check if it has a custom protected message, otherwise we\'ll just output the default main on
                    $level = new M_Level( $id );
                    $message = $level->get_meta( \'level_protectedcontent\' );
                    if(!empty($message)) {
                        return stripslashes($message);
                    }
                }
            }
        } else {
            if(!empty($notshortcodes)) {
                // search positive shortcodes first
                $id = array_search( $code, $notshortcodes );
                if($id !== false) {
                    // we have found a level so we need to check if it has a custom protected message, otherwise we\'ll just output the default main on
                    $level = new M_Level( $id );
                    $message = $level->get_meta( \'level_protectedcontent\' );
                    if(!empty($message)) {
                        return stripslashes($message);
                    }
                }
            }
        }
编者注:我删除了所有指向(封闭源代码)插件的链接,因为它们与实际问题的相关性与插件源代码的可访问性一样:零

2 个回复
SO网友:mrwweb

tl;博士

查找短代码的注册位置

Remember: All of the functions below are made up. The point of the first two steps is finding the right values to plug into the snippets.


查找短代码的注册位置

使用记事本++或Sublime Text 2(我个人最喜欢的)之类的程序,可以一次搜索多个文件。然后搜索以下内容的一些变体,其中“member”是您正在使用的短代码:

  • add_shortcode( \'member\'
  • add_shortcode(\'member\'
  • add_shortcode( "member"
  • add_shortcode("member"
    • 查找短码输出函数,其中一个可能会引导您找到如下代码行:

      add_shortcode( \'member\', \'member_shortcode\' );
      
      那么你需要找到"member_shortcode" 作用看看附近的街道add_shortcode 函数以查看是否看到它。如果没有,请搜索:

      function member_shorcode(
      
      祈祷有一个过滤器,然后这就是真理的时刻。您一直在祈祷短代码为短代码输出提供一个过滤器。这样你就可以做这样的事情:

      function recursive_member_shortcode( $content ) {
          return do_shortcode( $content );
      }
      add_filter( \'member_shortcode_filter\', \'recursive_member_shortcode\', 9999 );
      
      如果没有过滤器,你唯一的选择就是破解插件文件本身,这是个坏消息。

      作为一个bug进行报告,老实说,已经说过以上所有内容,对我来说这似乎是一个bug,我会将其报告给WPMU。但考虑到我在他们的支持和代码质量方面的经验,我不会抱太大希望。

SO网友:kaiser

无论你需要对短代码做什么:你都可以过滤它们。

Core使用以下过滤器。

apply_filters( "shortcode_atts_{$shortcode}", $out, $pairs, $atts );
所以,只要third 调用时使用参数shortcode_atts(), 这很容易,因为您的过滤器回调可以简单地挂接到

"shortcode_atts_{$third_Argument}"
如果不是这样的话(由于这是可选的,大多数开发人员都忘记了),那么您必须在回调参数中搜索唯一的(尽可能多的)标识符。

然后可以过滤输出。从那以后,附加其他短代码和每一个funk都没有问题。

注:我不确定这个答案在多大程度上与这个问题有关。

结束

相关推荐

Custom field within shortcode

我目前正在使用“WP Simple Paypal Shopping Cart”插件建立一个简单的Paypal电子商务网站,它非常容易使用,但为了节省客户编写短代码的时间,我在后端设置了自定义字段以输入产品名称和价格TheAdd to Cart 按钮是使用一段简单的短代码生成的,如下所示:<?php echo print_wp_cart_button_for_product(\'Product Name\', Product Price); ?> 显然正在替换Product Name