首页 > 解决方案 > 带有后备功能的 WordPress 简码

问题描述

我正在构建一个使用地理服务 Web 服务的简单插件,而我正在尝试根据其位置动态更改 WordPress 页面上的内容。我让它有点工作,但我的问题是它同时返回特定于位置的文本和默认值。我知道这是因为我不止一次使用简码实例,但我不知道如何将其更改为仅显示特定于位置的内容,如果位置未设置或与简码参数不匹配,则回退到默认一个。我不想将“默认”添加为简码参数,因为它可能包含 HTML 或其他内容。

这是我的简码示例:

[geo city="Orlando"]<a href="#">555-123-6349</a>[/geo][geo city="Raleigh"]<a href="#">919-999-9999</a>[/geo][geo city="Default"]<a href="#">Default text here</a>[/geo]

因此,基于上述内容,如果用户来自奥兰多,则所需结果将显示奥兰多的电话号码,如果用户来自罗利,则将显示罗利号码。否则,如果他们不是来自这些地方的任何一个,它将使用默认值。

这是我的简码:

function geo_services( $atts , $content = null ) {

    // Attributes
    extract(shortcode_atts(array(
      'city' => '',
      'state' => '',
   ), $atts));

    require_once('geoplugin.class.php');

    $geoplugin = new geoPlugin();

    $geoplugin->locate();

    if($city === $geoplugin->city){
        return $content;
    } elseif ($state === $geoplugin->region){
        return $content;
    } elseif ($city === 'Default') {
        return $content;
    }


}
add_shortcode( 'geo', 'geo_services' );

这是我使用上面的示例短代码时发生的情况: 在此处输入图像描述

标签: wordpressshortcode

解决方案


我相信您可能会误解短代码在 WP 中的工作方式。在您的示例中,您向内容添加了 3 个简码。这些短代码中的每一个都将运行。不是其中之一。这样做,

[geo city="Orlando"]<a href="#">555-123-6349</a>[/geo][geo city="Raleigh"]<a href="#">919-999-9999</a>[/geo][geo city="Default"]<a href="#">Default text here</a>[/geo]

意味着每一个都将被调用和评估。$geoplugin->city无论您提供什么属性,总是会返回用户所在的城市。而且由于您$content在所有情况下都返回,它总是会吐出您在短代码中添加的内容。这就是您看到所有 3 个响应的原因。

相反,我会尝试下面的方法。如果您的目标是根据用户所在的城市输出内容,那么您实际上不需要为短代码提供属性。请参见以下示例:

//in your post/page content, simply use the shortcode geo
[geo]

//your function should be
function geo_services( $atts , $content = null ) {

    //
    require_once('geoplugin.class.php');

    //
    $geoplugin = new geoPlugin();
    $geoplugin->locate();

    //
    switch( $geoplugin->city ) {
        case 'Orlando':
                return '<a href="#">555-123-6349</a>';
            break;
        case 'Raleigh':
                return '<a href="#">919-999-9999</a>';
            break;
        default:
                return '<a href="#">Default text here</a>';
            break;
    }

}
add_shortcode( 'geo', 'geo_services' );

推荐阅读