将快捷码属性传递给子函数

时间:2014-01-03 作者:Imperative Ideas

这既是一个WordPress问题,也是一个PHP问题,因为PHP程序员可能知道WP小组不知道的技术。

我一直在尝试编写一个短代码,用于激发Foundation Reveal代码,以便与WP编辑器内联使用。我设想它可以这样工作:

[reveal size="medium" bg="true" slug="page-slug"]Open a modal with this link![/reveal]
shortcode指定模式大小、是否使用黑色背景,以及在自定义单页循环中合并来自哪个页面段塞的内容(这允许我们使用非公共自定义post类型来保存模式数据)。还有其他属性,但为了简单起见,我还没有编写它们。

这就是问题的症结所在。

模态分为两部分,链接和隐藏DIV。DIV通常位于站点的页脚。我可以把它内联起来解决我的问题,但这会对谷歌的网络缓存造成严重破坏。否,模态需要是页脚中的旁白。

所以我有点聪明。我让短代码返回目标链接,但我也让它注册了一个挂钩(放在footer.php中),其中附加了一个content DIV。在我意识到变量范围有问题之前,一切都很正常。首先,这是我当前的代码:

/**
 * Foundation Reveal Shortcode
 */

// Create an action to be placed in the site footer. We will target this with the second half of the function
function foundation_reveal() {
    do_action(\'foundation_reveal\');
}

// Set up the shortcode for the modal
function reveal_setup($atts, $content) {

    // Extract the attributes
    extract(shortcode_atts(array(
        \'size\'  =>  \'medium\',
        \'slug\'  =>  \'dummy\',
        \'bg\'    =>  \'reveal-modal\'
    ), $atts));

    $modal_link  = \'<a href="#" data-reveal-id="\' . $slug . \'">\';
    $modal_link .= $content;
    $modal_link .= \'</a>\';

    if ($slug == \'dummy\') {
        $the_modal = \'<div id="\' . $slug . \'" class="\' . $size . \' \' . $bg . \'" data-reveal>\' . \'reminder/dummy content goes here\' . \'</div>\';
    } else {
        $the_modal = \'<div id="\' . $slug . \'" class="\' . $size . \' \' . $bg . \'" data-reveal>\' . \'post loop based on page slug goes here\' . \'</div>\';
    }

    function reveal_content($the_modal) {
        echo $the_modal;
    }

    add_action(\'foundation_reveal\', \'reveal_content\');

    return $modal_link;
}


/**
 * Setup shortcodes for this theme
 */

// Register all shortcodes
function gmfi_shortcodes() {
    add_shortcode(\'reveal\', \'reveal_setup\');
}

// Add shortcodes to the init hoook
add_action( \'init\', \'gmfi_shortcodes\');
而且,看到IDE对整个事情进行颜色编码是很有帮助的,here\'s a link to that image.

这个问题对于任何PHP程序员来说都是显而易见的。为了将$slug之类的内容传递给第二个函数(该函数连接到页脚),我需要通过引用传递变量。

i、 例如,我必须这样做:

add_action(\'foundation_reveal\', \'reveal_content($slug)\');
不幸的是,WordPress并不是这样工作的。

那么问题来了。。。你能想出另一种方法通过引用传递那个变量吗?因为如果没有,我可能不得不接受它并编写一个定制的钩子/动作脚本。如果有一种方法可以使用可用的WordPress组件来实现,那么这个选项似乎是浪费。但是,如果有另一种方法,WordPress/Foundation插件套件可能已经做到了。

不管怎样,我都需要你们帮我想出下一步。

非常感谢你坚持我的解释!

另外注意:页脚中的foundation\\u reveal()钩子肯定会被触发,它只是没有得到传递给它的任何类或ID数据。

2 个回复
最合适的回答,由SO网友:gmazzap 整理而成

有不同的方法可以获得结果。您可以使用类,将div内容存储在类或实例变量中,并在需要时输出它。

也可以使用带有静态变量的函数来保存内容。

我将使用第二种选择,在类中转换它对您来说是一种练习;)

在上瘾中,你可以使用核心\'wp_footer\' 钩子来输出内容,这样您就不必添加额外的钩子,也不必使用模板标记。

function reveal_setup($atts = array(), $content = \'\') {
  // Setup the static variable. Use an array to allow multiple calls per page
  static $the_modals = array();
  // if the function is called from wp_footer hook
  if ( current_filter() === \'wp_footer\' ) {
    if ( is_array($the_modals) && ! empty($the_modals) ) {
      foreach( $the_modals as $amodal ) {
        echo $amodal;
      }
    }
  // if the function is called from shortcode
  } else {
    // Get the attributes
    $atts = shortcode_atts(
      array( \'size\' => \'medium\', \'slug\' => \'dummy\',\'bg\' => \'reveal-modal\' ),
      $atts,
      \'reveal\' // enable filtering
    );
    // prepare the_modal link
    $modal_link  = \'<a href="#" data-reveal-id="\' . $atts[\'slug\'] . \'">\';
    $modal_link .= $content;
    $modal_link .= \'</a>\';
    // prepare the_modal content
    $modal_format = \'<div id="%s" class="%s %s" data-reveal>\';
    $the_modal = sprintf( $modal_format, $atts[\'slug\'], $atts[\'size\'], $atts[\'bg\'] );
    if ( $atts[\'slug\'] == \'dummy\' ) {
      $the_modal .= \'reminder/dummy content goes here\';
    } else {
      $the_modal .= \'post loop based on page slug goes here\';
    }
    $the_modal .= \'</div>\';
    // save the modal content in the static modals array
    $the_modals[] = $the_modal;
    // add the present function to wp_footer hook if it is not already added
    if ( ! has_action(\'wp_footer\', __FUNCTION__) ) {
      add_action( \'wp_footer\', __FUNCTION__ );
    }
    // return the modal link
    return $modal_link;
  }
}

add_shortcode(\'reveal\', \'reveal_setup\');
仅此而已。Untested.

PS:extract 使用是一种不好的做法,(尽管我知道它主要用于核心代码和Codex示例中…)

SO网友:birgire

您还可以使用匿名函数,让它通过use 关键字(如果您得到PHP)。

Examples:

add_action( \'init\', function() {

    // Example 1: Append stuff to the titles    
    $stuff = \'...\';    
    add_filter( \'the_title\', function( $title ) use ( $stuff ){
        return $title . $stuff ;
    });

    // Example 2: Display message in the footer   
    $msg = \'The End\';
    add_action( \'wp_footer\', function() use ( $msg ){
        echo $msg ;
    });

    // Example 3: Run an action only once  
    add_action( \'the_content\', $callback = function( $content ) use ( &$callback ){
        remove_filter( current_filter(), $callback ); // __FUNCTION__ doesn\'t work here.
        return strtolower( $content );
    });

});

结束

相关推荐

通过子主题函数.php文件将特色图片添加到RSS提要

我试图在一个运行pinbin儿童主题的博客上向我的RSS提要添加特色图像。当我安装并激活插件“将特色图像添加到RSS提要”时,它就可以工作了。当我尝试在子函数中粘贴此插件的代码时。php文件它不起作用(事实上,当它粘贴到我的functions.php文件中时,我在internet上发现的任何代码都不起作用,例如Can't Display Featured Image in RSS Feed )代码为function add_featured_image_to_feed($content) {&#x