首页 > 解决方案 > 如何在 Wordpress 的另一个简码中使用简码的输出?

问题描述

我编写了一个短代码,它返回一个在我的 php 文件中设置的变量,我需要在另一个从插件“插入页面”获得的短代码中使用该变量的值。我知道我不能做 [insert page='[left]' display='content'] 因为 Wordpress 解析器在第一个 ] 处结束短代码,但我想知道是否有办法解决这个问题。

这是我页面的代码,对缩进不好表示歉意。我的 php 文件中的简码是 [right] 和 [left],它们返回一个与用户选择的选项的值相对应的数字。另一个短代码来自插入页面插件,并将所需的 ID 作为要显示的页面的值。

有问题的代码位于第一个“选择”标签下方。143380 是一个值的示例,这就是我需要我的简码结果的地方。

<form id="form" action="" method="get">
[one_half]
<h3>Select a Country</h3>
<div class="dropdown"><select id="dropdownl" name="dropdownl">
<option disabled="disabled">Country</option>
<option disabled="disabled">North America</option>
<option value="62292">Canada</option>
<option value="72808">Mexico</option>
<option value="144586">Puerto Rico</option>
<option value="163668">United States</option>
<option disabled="disabled">South America</option>
<option value="63839">Argentina</option>
<option value="67922">Brazil</option>
<option value="78702">Colombia</option>
<option value="60670">Peru</option>
<option disabled="disabled">Oceania</option>
<option value="32137">Australia &amp; New Zealand</option>
<option disabled="disabled">Africa</option>
<option value="63210">Egypt</option>
<option value="78700">South Africa</option>
<option disabled="disabled">Asia</option>
<option value="66137">China</option>
<option value="49932">India</option>
<option value="40308">Israel</option>
<option value="78709">Japan</option>
<option value="223252">Philippines</option>
<option value="60438">Republic of Korea</option>
<option value="69605">Singapore</option>
<option value="70391">Taiwan</option>
<option value="71971">Thailand</option>
<option disabled="disabled">Europe</option>
<option value="32142">Austria</option>
<option value="32146">Belgium</option>
<option value="78707">Bulgaria</option>
<option value="72763">Czech Republic</option>
<option value="31277">Denmark</option>
<option value="62393">Finland</option>
<option value="31223">France</option>
<option value="31026">Germany</option>
<option value="63208">Greece</option>
<option value="63016">Hungary</option>
<option value="183519">Ireland</option>
<option value="122492">Italy</option>
<option value="142792">Lithuania</option>
<option value="162411">Netherlands</option>
<option value="67164">Norway</option>
<option value="56320">Poland</option>
<option value="62344">Portugal</option>
<option value="67210">Romania</option>
<option value="68895">Russian Federation</option>
<option value="143380">Serbia</option>
<option value="78705">Slovakia</option>
<option value="25372">Spain</option>
<option value="25520">Sweden</option>
<option value="25408">Switzerland</option>
<option value="67375">Turkey</option>
<option value="63212">Ukraine</option>
<option value="25482">United Kingdom</option>
</select></div>

[left]

[insert page='143380' display='content']

[/one_half]

[one_half_last]
<h3>Select a Country</h3>
<div class="dropdown">

<select id="dropdownr" name="dropdownr">
<option disabled="disabled">Country</option>
<option disabled="disabled">North America</option>
<option value="62292">Canada</option>
<option value="72808">Mexico</option>
<option value="144586">Puerto Rico</option>
<option value="163668">United States</option>
<option disabled="disabled">South America</option>
<option value="63839">Argentina</option>
<option value="67922">Brazil</option>
<option value="78702">Colombia</option>
<option value="60670">Peru</option>
<option disabled="disabled">Oceania</option>
<option value="32137">Australia &amp; New Zealand</option>
<option disabled="disabled">Africa</option>
<option value="63210">Egypt</option>
<option value="78700">South Africa</option>
<option disabled="disabled">Asia</option>
<option value="66137">China</option>
<option value="49932">India</option>
<option value="40308">Israel</option>
<option value="78709">Japan</option>
<option value="223252">Philippines</option>
<option value="60438">Republic of Korea</option>
<option value="69605">Singapore</option>
<option value="70391">Taiwan</option>
<option value="71971">Thailand</option>
<option disabled="disabled">Europe</option>
<option value="32142">Austria</option>
<option value="32146">Belgium</option>
<option value="78707">Bulgaria</option>
<option value="72763">Czech Republic</option>
<option value="31277">Denmark</option>
<option value="62393">Finland</option>
<option value="31223">France</option>
<option value="31026">Germany</option>
<option value="63208">Greece</option>
<option value="63016">Hungary</option>
<option value="183519">Ireland</option>
<option value="122492">Italy</option>
<option value="142792">Lithuania</option>
<option value="162411">Netherlands</option>
<option value="67164">Norway</option>
<option value="56320">Poland</option>
<option value="62344">Portugal</option>
<option value="67210">Romania</option>
<option value="68895">Russian Federation</option>
<option value="143380">Serbia</option>
<option value="78705">Slovakia</option>
<option value="25372">Spain</option>
<option value="25520">Sweden</option>
<option value="25408">Switzerland</option>
<option value="67375">Turkey</option>
<option value="63212">Ukraine</option>
<option value="25482">United Kingdom</option>
</select></div>

[right]
[/one_half_last]
<input type="submit" value="Submit" />

</form>

这是我在其中编写短代码的模板 php 文件。它们在 left_shortcode 和 right_shortcode 中定义。该文件基于我的主题 page.php:

<?php
/*
Template Name: Deven Template
*/
?>

<?php
/**
 * The template for displaying pages
 *
 * This is the template that displays all pages by default.
 * Please note that this is the WordPress construct of paages and that
 * other "pages" on your WordPress site will use a different template.
 *
 * @package WordPress
 * @subpackage Twenty_Sixteen
 * @since Twenty Sixteen 1.0
 */

get_header(); ?>
<?php
    $left = "";
    $right = "";
?>

<?php
    if(isset($_GET['dropdownl']) and isset($_GET['dropdownr'])) {
        global $left, $right;

        $left = $_GET['dropdownl'];
        $right = $_GET['dropdownr'];
        //echo $left;
    }
?>


<?php
function left_shortcode( $atts, $content = null )  {
    global $left; // if $unique is global var add this line too
    return $left;
}

add_shortcode( 'left', 'left_shortcode' );
?>

<?php
function right_shortcode( $atts, $content = null )  {
    global $right; // if $unique is global var add this line too
    return $right;
}

add_shortcode( 'right', 'right_shortcode' );
?>

<div id="primary" class="content-area">
    <main id="main" class="site-main" role="main">
        <?php
        // Start the loop.
        while ( have_posts() ) :
            the_post();

            // Include the page content template.
            get_template_part( 'template-parts/content', 'page' );

            // If comments are open or we have at least one comment, load up the comment template.
            if ( comments_open() || get_comments_number() ) {
                comments_template();
            }

            // End of the loop.
        endwhile;
        ?>

    </main><!-- .site-main -->

    <?php get_sidebar( 'content-bottom' ); ?>

</div><!-- .content-area -->

<?php get_sidebar(); ?>
<?php get_footer(); ?>

标签: htmlwordpress

解决方案


这个答案是在reddit上给我的:

“也许可以让嵌套的短代码工作,但你可能需要处理内容两次或其他什么,我想这不会是直截了当的。

我认为最简单的做法就是创建一个新的短代码作为包装器并在其中调用原始短代码。

所以,如果原件看起来像这样:[original_shortcode page=1]

你可以像这样创建一个:[original_shortcode_new page_alignment='left']

然后编写一个简码,转义/验证用户输入,并调用主简码。

本质上:

function original_shortcode_new( $args ) {

    $args = shortcode_atts( 
        array(
            'page_alignment' => ''
        ), $args, 'original_shortcode_new' );


    $page_id = '';

    if($args['page_alignment'] == 'left' && isset($_GET['dropdownl'])){
        $page_id = intval($_GET['dropdownl']);
    } else if($args['page_alignment'] == 'right' && isset($_GET['dropdownr'])){
        $page_id = intval($_GET['dropdownr']);
    }

    if(empty($page_id)){
        return "<p>Error, bad page</p>";
    }

    return do_shortcode("[original_shortcode page={$page_id}]");

}

add_shortcode( 'original_shortcode_new', 'original_shortcode_new' );

同样,在执行上述操作时,我将摆脱额外的短代码和全局变量,而只在单个短代码中使用一些逻辑。”

这是回答我上面问题的答案的一部分,但要查看完整的帖子,请单击此处:Reddit Question


推荐阅读