WordPress将变量传递给另一个短代码

时间:2016-09-21 11:22:31

标签: php wordpress

我有来自不同开发者的多个插件,这些插件允许我显示亚马逊产品。 他们都要求我在他们的短代码中输入亚马逊类别ID。

[amazon bestseller="1234567"]
[amz_links node="1234567"]
[amazon_toprated category="1234567"]

我在大量的页面,小部件等中使用这些短代码。 我不时地需要更改ID,并且手动更改它们是一件非常麻烦的事。

我的想法是创建自己的短代码,例如[myamazon_id],并在其他短代码中输入该短代码:[amazon bestseller="[myamazon_id]"]

不幸的是,这似乎不起作用,因为它们是自封的短代码,显然不允许短代码内的短代码。

我目前的解决方案是使用一个允许我在WordPress页面和小部件中使用PHP的插件。

[insert_php]echo do_shortcode( '[amazon bestseller="'.myamazonid().'"]' );[/insert_php]

这确实有效,但我想知道是否有更好的解决方案将varible传递给短代码。直接在页面和小部件上使用PHP并不是我感觉良好的事情。

我的目标是拥有这样的内容:[amazon bestseller="[myamazon_id]"]

3 个答案:

答案 0 :(得分:0)

一个简单的解决方案就是插件Post Snippets。在这个插件中,您可以创建3个新的短代码,其中包含3个带有类别ID的亚马逊短代码。现在您可以使用新创建的短代码,如果您想更改类别ID,只需在一个地方进行编辑即可。

答案 1 :(得分:0)

使用以下代码进行短代码[amazon bestseller="myamazon_id"]可能。

您无需使用这些大括号"[""]"

换行另一个短代码
function first_shortcode_amazon( $atts ) {
    $newvar = do_shortcode('['.$atts['bestseller'].']');
    return $newvar;
}
add_shortcode( 'amazon', 'first_shortcode_amazon' );


function second_shortcode_for_amazonid( $atts ) {
    global $post;
    // here i have placed global post id. you can do code to get amazon id here
    return 'AMAZON_ID=> '.$post->ID;
}
add_shortcode( 'myamazon_id', 'second_shortcode_for_amazonid' );

答案 2 :(得分:0)

首先,由于$ atts是一个数组,因此必须在函数中定义$ atts项。

这是在短代码中传递变量的完整代码-

让我们假设您需要通过简码显示该类别的所有产品,您需要在函数文件中执行以下代码-

     function creative_writing_func($atts) {
     $args = array(
    'post_type'      => 'product',
    'posts_per_page' => 10,
    'product_cat'    => $atts['categoryname']
);

$loop = new WP_Query( $args );

while ( $loop->have_posts() ) : $loop->the_post();
    global $product;
    echo '<br /><a href="'.get_permalink().'">' . woocommerce_get_product_thumbnail().' '.get_the_title().'</a>';
endwhile;

wp_reset_query();
}

add_shortcode('creative_writing_func_short', 'creative_writing_func');

现在,您只需将简码代码粘贴到模板文件或Wordpress默认编辑器中即可-

[creative_writing_func_short categoryname="creative-writing-english-literature"]

我们要在简码中传递类别名称(creative-writing-english-literature)。

已经测试过并且可以正常工作。