【问题标题】:PHP - including attribute in shortcodePHP - 包括短代码中的属性
【发布时间】:2014-11-10 17:23:44
【问题描述】:

这看起来像是一个 Wordpress 问题,但我认为它是 PHP 特定的,而不是 Wordpress。我认为我的问题出在// Code 块中。这是我的代码:

function display_app_rating( $atts ) {

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

// Code
//return '"http://itunes.apple.com/lookup?id='.($app).'"';
$json_url = '"http://itunes.apple.com/lookup?id='.($app).'"';
$json = file_get_contents($json_url);
$result = json_decode($json, TRUE);
foreach ($result['results'] as $key => $value) {
    return '<p class="appstore rating">Average rating '.$value['averageUserRating'].' out of 5 from '.$value['userRatingCount']. ' users.</p><p class="appstore price">Current Price '.$value['currency'].$value['price'].'</p>';
}
}
add_shortcode( 'apprating', 'display_app_rating' );

如果我将应用 ID 硬编码为 $app 变量,它可以正常工作,如果我注释掉我的代码并取消注释 return... 行,它会返回正确的 URL。我的问题是如何将$app 变量附加到 URL 并通过我的简码工作

[apprating app="439438619"]

任何帮助表示赞赏。

【问题讨论】:

  • $json_url = "itunes.apple.com/lookup?id=$app" 应该可以工作。您在不内联变量的字符串周围有单引号。我没有使用 wordpress 的经验,您能否验证提取中的 $app 设置是否正确?
  • 嗨,Hammerstein,不幸的是,尝试过它不起作用。当我简单地返回该行时,它会正确地内联 URL,并将引号内的变量作为 URL 的一部分。

标签: php wordpress shortcode


【解决方案1】:

我认为您不想在每次迭代后返回 - 将结果推送到变量中并只返回一次。

$result = json_decode($json, TRUE);
$block = '';
foreach ($result['results'] as $key => $value) {
    $block .='<p class="appstore rating">Average rating '.$value['averageUserRating'].' out of 5 from '.$value['userRatingCount']. ' users.</p><p class="appstore price">Current Price '.$value['currency'].$value['price'].'</p>';
}

return $block;

【讨论】:

  • 谢谢亚当,我可能会误解,但我感谢您的意见,毫无疑问,您的代码将改进我的代码。我遇到的问题是将我的 $app 变量作为简码定义到在此之前发生的 URL 中?
  • 听起来您应该将此函数拆分...尝试将其拆分为 get_app_rating()、set_app_url() 和 display_app_rating() 或类似函数。
  • 我想你们所有人都为我工作,非常感谢你们。我添加了您的块返回想法,但不需要创建单独的函数。
  • Right on =) 我建议使用单个函数的原因是它使测试更容易 - 可以考虑向前推进。
【解决方案2】:

使用extract() is not recommended。要检查 URL 中的查询值,请使用 $_GET

下面首先检查URL是否包含?app_id=something,如果是则输出结果。如果 URL 不包含它,则将使用短代码属性 [apprating app="something"]。否则,它会打印一条错误消息:

add_shortcode( 'apprating', 'shortcode_so_25877611' );

function shortcode_so_25877611( $atts, $content )
{
    $args = shortcode_atts( 
        array(
            'app'   => '',
        ), 
        $atts
    );

    $result = 'No app id.';
    $app = (int) $args['app'];

    if( !empty( $_GET['app_id'] ) )
        $result = (int) $_GET['app_id'];
    elseif( $app )
        $result = $app;

    $json_url = "http://itunes.apple.com/lookup?id=$result";

    return $return;
}

帖子上的测试短代码如下,然后将查询变量附加到 URL:

With id: [apprating app="1234"]

Without: [apprating]

PS:作为noted by Adam,你的return必须在foreach循环之外。

【讨论】:

  • 非常感谢您。如果可能的话,你能提供进一步的帮助吗?我的其余代码在哪里适合这个?例如$json_url = '"http://itunes.apple.com/lookup?id='.($app).'"'; $json = file_get_contents($json_url); 等我可以看到 $app 变量的返回,但它似乎没有附加到 URL?
  • 我添加了一个示例。你用错了引号,了解PHP中单引号和双引号的区别,这很重要。
  • 谢谢,我有一个包含您的 cmets 的工作版本。我确实认为我正确使用了引号,但不是因为我错误地接近它。
【解决方案3】:

这是我用完的代码。这是各种反应的混合。似乎工作正常。感谢指导。

add_shortcode( 'myrating', 'display_my_app_rating_89' );
function display_my_app_rating_89( $atts, $content )
{
$args = shortcode_atts( 
    array(
        'app'   => '',
    ), 
    $atts
);

$result = 'No app id.';
$app = (int) $args['app'];

if( !empty( $_GET['app_id'] ) )
    $result = (int) $_GET['app_id'];
elseif( $app )
    $result = $app;

$json_url = "http://itunes.apple.com/lookup?id=$result";
//normal PHP version commented out and wordpress version activated - appears to be Wordpress best practice.
//$json = file_get_contents($json_url);
//wordpress version
$json = wp_remote_retrieve_body (wp_remote_get($json_url));
$result = json_decode($json, true);
$block = '';
foreach ($result['results'] as $key => $value) {
$block .='<span> ... whatever I wanted to return from JSON URL plus my HTML here ... </span>';
}
return $block;
}

【讨论】:

  • 我有一个补充问题。 JSON URL 返回的字段之一包含\n 用于换行符。此函数将它们剥离并返回一个简单的文本块。我想保留换行符 - 所以我想将 \n 转换为 &lt;br&gt; 标签。是否有一个简单的编辑来实现这一点?
  • 我已经尝试过这些方法 - stackoverflow.com/questions/5946114/replace-r-n-with-br 但没有运气在 $json = wp_remote_retrieve_body (wp_remote_get($json_url)); 行之后插入
  • 知道了 - 所有示例代码都使用双引号,无论出于何种原因,我都需要切换到单引号 $json = str_replace(array('\r\n','\r','\n'),'&lt;br/&gt;', $json);
猜你喜欢
  • 1970-01-01
  • 2020-04-16
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 2014-05-19
  • 2013-11-24
  • 2013-03-18
相关资源
最近更新 更多