将参数从短代码传递到wp_footer以执行操作

时间:2012-10-17 作者:jchwebdev

快把我逼疯了。

我有一个很好的短代码,但有一个细节。我不会发布全部内容,但它会提取帖子的内容(效果很好),然后将其中的一部分内容回传到页脚中的一个新DIV。

我这样做是因为,很明显,您不能通过add\\u操作将变量传递给匿名函数。

add_shortcode(\'tooltip\', \'tooltip\');
function tooltip( $atts, $content=null) { 
  $output = \'...some stuff from another post.\';
  //...working fine...

  do_action( \'jch_tooltip_func\', \'text to put in footer\' );
  // the text arg is never passed to jch_tooltip_func();

  return $output;

}

add_action(\'wp_footer\', \'jch_tooltip_func\', 100, 1);

function jch_tooltip_func( $d ) { 
  echo(\'<p>DIV TEST:\' . $d . \'END</p>\' );
    return($d);
}
。。。因此,“要放入页脚的文本”应该传递给jch\\u tooltip\\u func(),然后通过wp\\u footer放置我的页脚。但这场争论从未获得通过。

为什么?为什么?

TIA,

---JC公司

3 个回复
SO网友:fuxia

使用类,将所需的值存储在成员变量的页脚中。

未测试的示例代码:

add_shortcode( \'tooltip\', array ( \'WPSE_69605_Tooltip\', \'shortcode_callback\' ) );

class WPSE_69605_Tooltip
{
    protected static $var = \'\';

    public static function shortcode_callback( $atts, $content = \'\' )
    { 
        self::$var = \'foo\';
        add_action( \'wp_footer\', array ( __CLASS__, \'footer\' ) );
    }

    public static function footer()
    {
        echo self::$var;
    }
}

SO网友:Mridul Aggarwal

因为提供给的第一个参数do_action 不是函数名,而是标记名。他们是这样工作的

add_action( \'tag-name\', \'function_name\' );

// some other code

do_action( \'tag-name\' ); // will call the function \'function_name\'

THE SOLUTION

如果要添加的文本是静态的,如上例所示,请删除add_action(\'wp_footer\', ...) &;更换do_action 具有

add_action(\'wp_footer\',
 create_function( \'\', \'echo(\\\'<p>DIV TEST:\\\' . \\\'text to put in footer\\\' . \\\'END</p>\\\' );\' ),
 100,
 0);
如果文本是动态的,那么可以采用以下两种方法之一

首先,使用var_export() 上述解决方案代码中的php函数

其次,将变量保存到某个全局/静态变量中(只需确保它是安全的)(&;那你用过的地方add_action 在上面,而不是create\\u function传递将读取该变量的函数的名称(&U);输出它。类变量最适合这种情况,但它可以是任何变量,只要您确定它没有被其他插件修改

SO网友:Kolawole Emmanuel Izzy

我知道这很古老,但这是我的答案,它可以帮助任何面临类似挑战的人。基于@fuxia code,她的代码工作正常,但只显示一个输出。假设您在一个页面上有多个短代码实例,则只有一个操作挂钩会添加到页脚。

如果要根据短代码在页面上的使用次数添加多个操作,请使用以下代码;

add_shortcode( \'izzycart_popup\', array ( \'MFP_PopUP_Shortcode\', \'load_shortcode\' ) );

class MFP_PopUP_Shortcode {

    protected static $var = array();

    public static function load_shortcode( $atts, $content = \'\' ) {
        /**
        * Write all your shortcode stuff here.
        * Make sure you use either unique_id() or mt_rand() to generate ID in your
        * shortcode for later use
        **/

        /**
        * Depending on what you\'re using this for, send parameters from shortcode to
        * new function. I used this for a iPad frame Video, So i parsed the following
        * @params $video_url  -  Video URL from the shortcode_atts()
        * @params $video_poster  -  Video poster id from the shortcode_atts()
        * @params $el_id  -  element ID generated from either unique_id() or mt_rand()
        * @params array $OtherContent  -  Array of other values you want to parse to the function
        **/
        self::$var[] = self::load_the_popupcontent($video_url, $video_poster, $el_id, $OtherContent); 
        add_action( \'wp_footer\', array ( __CLASS__, \'send_to_footer\' ) );
    }

    public static function send_to_footer() {
        foreach (self::$var as $theElementToFooter) {
             echo $theElementToFooter;
        }
    }
    public static function load_the_popupcontent( $url=\'\', $poster=\'\', $video_id = \'\', $args = array() ) {
        // Write all your code to be added to footer here and use all the variables where needed.
    }
} 
NOTE: 如果你只想在页脚上添加一个元素,而不管这个短代码使用了多少次,@fuxia的答案就是你想要的。

经过测试,工作正常<快乐的编码!

结束

相关推荐

no content after shortcode

我希望你们能帮我解决我遇到的这个小错误。我正在使用一个快捷码在条目中显示音频播放器。这是我在函数中输入的代码。php:function html5_audio($atts, $content = null) { extract(shortcode_atts(array( \"src\" => \'\', \"preload\"=> \'none\', \"loop\" => \'\' ), $atts)); retu