快捷代码和GET_TEMPLATE_PART

时间:2019-07-16 作者:Irene88

我正在为我的wordpress开发自己的插件。我使用自定义分类法和自定义单个CPT为插件和CPT创建了一个短代码。

当我尝试在短代码中使用函数get\\u template\\u part()时,结果是调用单个。主题中的php模板。如何限制get\\u template\\u part查找文件的位置?

这是我的短代码:

function shortcode_display_products ( $atts ){

 global $wpdb;
 $query = \'\';

 $atts = shortcode_atts( array(
   \'categories\' => \'\'
 ), $atts, \'shortcode_display_products\');


if( !empty($atts[\'categories\']) && !is_null($atts[\'categories\']) ){
$query = new WP_Query( array(
  \'post_type\'     =>  \'products\',
  \'post_status\'   => \'public\',
  \'tax_query\' => array(
    array(
      \'taxonomy\'=> \'groups\',
      \'field\'   => \'slug\',
      \'terms\'   => \'"\'.$atts[\'categories\'].\'"\'
    )
  ),
  \'showposts\'     =>  -1,
  \'orderby\'       =>  \'date\',
  \'order\'         =>  \'DESC\'
));
}
else{
$query = new WP_Query( array(
  \'post_type\'   =>  \'products\',
  \'post_status\' => \'public\',
  \'showposts\'   =>  -1,
  \'orderby\'     =>  \'date\',
  \'order\'       =>  \'DESC\'
));
}
ob_start();

if( $query->have_posts() ){

  $c = 0;

  while ( $query -> have_posts() ){

      $query -> the_post();
      get_template_part(\'single\',\'products\');

    $c++;
 }
}
else{
 return esc_html__(\'Not found any product register\',P_TEXTDOMAIN);
}

wp_reset_postdata();

return ob_get_clean();

}

add_shortcode(\'display_products\',\'shortcode_display_products\');
这是我的单一产品:

if ( !is_single() ){

 include \'/form/products-form.php\';
 $idnumber = ( is_single() )? \'\': \'-\'.$c;
?>

<div class="card">
  <div class="card-header" id="heading<?= $idnumber?>">
    <h5 class="mb-0">
      <button class="btn btn-link" data-toggle="collapse" data-target="#collapse<?= $idnumber?>" aria-expanded="true" aria-controls="collapse<?= $idnumber?>">
        <?= $post->title ?>
      </button>
    </h5>
  </div>
  <div id="collapse<?= $idnumber?>" class="collapse show" aria-labelledby="heading<?= $idnumber?>" data-parent="#accordion">
    <div class="card-body">
      <?= $post->content ?>
      <?php create_product_form() ?>
    </div>
  </div>
</div>

<?php }
else{ _e(\'nothing else\',P_TEXTDOMAIN);}

}

1 个回复
SO网友:nmr

作用get_template_part() load file only from theme 目录(或子主题)。没有任何筛选器或操作挂钩可以更改此行为。

你需要自己写get_template_part() 从插件目录加载文件的变量(替换locate_template() 从原始函数调用)。或者写一个明确的:

$query->the_post();
include plugin_dir_path( __FILE__ ) . \'single-products.php\';

相关推荐

_Single在GENSION中不能正常工作

我目前正在为我的网站创建一个子主题,它使用Genesis作为父主题。现在我正在根据自己的选择制作单页。因此,我将从HTML main中删除条目标题,并在entry-header. 我的代码如下所示。remove_action( \'genesis_entry_header\', \'genesis_do_post_title\' ); remove_action( \'genesis_entry_header\', \'genesis_post_info\', 12 ); add_acti