html - 如何在 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 & 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 & 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(); ?>
解决方案
这个答案是在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
推荐阅读
- ruby-on-rails - 如何在继续控制器操作 after_update 之前等待 Rails 服务响应?
- android-studio - 当我尝试构建离子项目时,Android Studio 出现以下错误“Gradle 同步失败:同步失败:原因未知”
- adobe - 在 adobe 分析中查看时,表单初始化和成功+放弃有多少差异是可以接受的
- node.js - 如何从一个集合中传递一个 id 并使用它来使用带有 nodejs 的 mongodb 本机驱动程序设置另一个模型
- php - 在 SELECT 之前对大量行应用 ORDER BY 但性能良好?
- javascript - 如何使用 Firebase 9(模块化 sdk)更新 Firebase 实时数据库中的数据
- python - 按优先级根据键值从列表中删除重复字典
- html - 为什么我的 google recaptcha 在小屏幕上会中断?
- oracle - 具有选择批量和循环的独特输出
- javascript - 如何将三个 js 对象居中到 DIV 中: