WordPress:为不同简码中的值调用简码

WordPress: Calling a shortcode for a value in a different shortcode

我对此很陌生,所以如果这是一个愚蠢的问题,请放轻松。

我正在构建一个带有事件管理器和 geo 我的 WordPress 插件的站点。我希望用户能够输入他们的自动填充位置(通过 GMW),并让 EM 输出中的日历仅在距该位置一定距离的事件中发生。我已经(通过手持)到了一个点,我有一个简码可以吐出输入位置的坐标。 EM 完整日历短代码采用名为 'near' 的属性,该属性采用坐标并随后输出所需的日历。

当前代码:

[fullcalendar near=[gmw_current_latlng] near_distance=20]

with [gmw_current_latlng] 通常返回用逗号分隔的纬度和经度。通常,near att 取 50.111123、-45.234 等

我的问题是,这种固执己见的方法似乎得不到我想要的东西。同样,我对编码很陌生,了解不多,但我已经研究这个问题好几个星期了,还没有找到答案。我试过很多不同的路线,但这条路让我离我想去的地方很近。

GMW 开发人员对这个问题是这样说的:

"The thing is that I am not even sure if you can pass a value to a shortcode using another shortcode. I’ve never tried this myself. The best way would be to use filters and a custom function to “inject” the coords directly into the calendar function."

如果他是对的,那是不可能的,我不知道如何执行他的第二个建议。希望我能解决这个问题,因为坦率地说,我的网站依赖于它的运行。

正如@Jeppe 提到的,你可以做到 Nested Shortcodes:

[shortcode_1][shortcode_2][/shortcode_1]

但是解析器不喜欢将短代码值作为其他短代码中的属性。

听起来您依赖于一些插件及其简码,所以我不建议编辑这些简码 - 但如果您查看 Shortcode API,添加您自己的简码非常容易。为简单起见,此示例将不包含确保短代码 exist/plugins 已安装等的 "proper" 方法,而只是假定它们已安装。

// Register a new shortcode called [calendar_with_latlng]
add_shortcode( 'calendar_with_latlng', 'calendar_with_latlng_function' );

// Create the function that handles that shortcode
function calendar_with_latlng_function( $atts ){
    // Handle default values and extract them to variables
    extract( shortcode_atts( array(
        'near_distance' => 20
    ), $atts, 'calendar_with_latlng' ) );

    // Get the current latlng from the gmw shortcode
    $gmw_current_latlng = do_shortcode( '[gmw_current_latlng]' );

    // Drop that value into the fullcalendar shortcode, and add the default (or passed) distance as well.
    return do_shortcode( '[fullcalendar near='. $gmw_current_latlng .' near_distance='. $near_distance .']' );
}

如果 [gmw_current_latlng] returns 为您的 [fullcalendar] 简码提供了可用的格式,您现在应该可以使用结合了两者的新简码:[calendar_with_latlng] 或者您也可以添加near_distance属性:[calendar_with_latlng near_distance=44].

您只需要将上述功能放入您的 functions.php,创建一个 Simple Plugin, or save them to a file and add it in your Must-Use Plugins 目录。

当然,您可以将一个短代码作为另一个短代码的属性传递。唯一的问题是,属性不通过 [ 或 ]。所以你已经用他们的 html 条目替换了将他们括起来的转换。

[ 替换为 [,将 ] 替换为 ],您应该没问题。这是一个例子。

function foo_shortcode( $atts ) {

    $a = shortcode_atts( array(
        'foo' => "Something",
        'bar' => '',
    ), $atts );

    $barContent = html_entity_decode( $atts['bar'] );
    $barShortCodeOutput = do_shortcode($barContent);

    return sprintf("Foo = %s and bar = %s", $a['foo'], $barShortCodeOutput);
}
add_shortcode( 'foo', 'foo_shortcode' );


function bar_shortcode( $atts ) {
    return "Output from bar shortcode";
}
add_shortcode( 'bar', 'bar_shortcode' );

然后把它放在你的编辑器上

[foo bar=[bar] ]

看到我们正在传递一个短代码 [bar] 作为 [foo] 的属性。所以输出应该是 - Foo = Something and bar = Output from bar shortcode

我知道它看起来有点恶心,但它可以解决问题。