如何在带有变量的插件短代码中使用模板来编写大的HTML代码

时间:2018-01-19 作者:Italo Borges

我有一个短代码,将有一个大的HTML。

它将有4个选择,我将在短代码中获取数据:

$house_types = get_terms(array(
  \'taxonomy\' => \'house_types\',
  \'hide_empty\' => 0
));
我想插入一个可以读取此变量的模板,以便构建select,my template文件:

<label for="tipo">Tipos:</label>
<select name="tipo" id="house_types">
  <option disabled selected value></option>
  <?php
    if(count($house_types) > 0) {
      foreach($house_types as $house_type) {
        echo \'<option value="\'.$house_type->term_id.\'">\'.$house_type->name.\'</option>\';
      }
    }
  ?>
</select>
我试图使用这个,但将模板放在主题中而不是插件目录中没有意义:

function rci_search_houses( $atts ) {
  ob_start();

  $house_types = get_terms(array(
    \'taxonomy\' => \'house_types\',
    \'hide_empty\' => 0
  ));

  get_template_part(\'search\', \'select\');
  $output = ob_get_contents();
  ob_end_clean();  
  return $output;
}

add_shortcode(\'rci-search-houses\', \'rci_search_houses\');
但它没有显示任何东西。

有谁知道一种更好的方法来组织短代码,以防它有一个大的html?

2 个回复
最合适的回答,由SO网友:Mark Kaplun 整理而成

您的核心问题是,您将值作为全局值传递,但从不将其声明为全局值。

一般来说,当您希望让其他人能够通过子主题或插件覆盖它们时,“模板部分”很有用,但如果您正在执行“一次性”主题,则最好编写一个函数来生成表单并向其传递相关参数,而不是使用全局变量。

SO网友:Dharmishtha Patel
<label for="tipo">Tipos:</label>
<select name="tipo" id="house_types">
  <option disabled selected value></option>
  <?php
    if(count($house_types) > 0) {
      foreach($house_types as $house_type) {
        echo \'<option value="\'.$house_type->term_id.\'">\'.$house_type->name.\'</option>\';
      }
    }
  ?>
</select>

<?php echo do_shortcode(\'[rci-search-houses]\');?>
结束