在一个页面上编写多个WP_查询最有效的方法是什么?

时间:2022-02-18 作者:Sackadelic

这是我之前关于一页上多个类别/帖子的帖子的后续。

目前,我有一个页面,其中有一个自定义帖子类型的每个类别的多个循环。问题是代码变得有点难以编辑和组织。以下是我拥有的多个类别的一个小示例:

$stratocaster_args = array(
    \'post_type\' => \'diagram\',
    \'tax_query\' => array(
        array(
            \'taxonomy\' => \'diagram-category\', // Taxonomy slug
            \'terms\' => \'stratocaster-wiring-diagrams\', // Taxonomy term slug
            \'field\' => \'slug\',    // Taxonomy field
        )
    )
);

$telecaster_args = array(
    \'post_type\' => \'diagram\',
    \'tax_query\' => array(
        array(
            \'taxonomy\' => \'diagram-category\', // Taxonomy slug
            \'terms\' => \'telecaster-wiring-diagrams\', // Taxonomy term slug
            \'field\' => \'slug\',    // Taxonomy field
        )
    )
);
$misc_fender_args = array(
    \'post_type\' => \'diagram\',
    \'tax_query\' => array(
        array(
            \'taxonomy\' => \'diagram-category\', // Taxonomy slug
            \'terms\' => \'misc-fender-wiring-diagrams\', // Taxonomy term slug
            \'field\' => \'slug\',    // Taxonomy field
        )
    )
);

$stratocaster_query = new WP_Query($stratocaster_args);
$telecaster_query = new WP_Query($telecaster_args);
$misc_fender_query = new WP_Query($misc_fender_args);

?>

<div class="blog-archive">

    <?php get_template_part(\'template-parts/page\', \'header\'); ?>

    <?php page_wrapper_open(\'wiring-diagrams\'); ?>



    <?php

    /**Begin Wiring Diagram Results */

    /**Strat */

    if ($stratocaster_query->have_posts()) :

        echo \'<h2 class="main-heading gold-line">STRATOCASTER WIRING DIAGRAMS:</h2>\';

        echo \'<div class="wiring-diagram-results grid-4">\';

        while ($stratocaster_query->have_posts()) :
            $stratocaster_query->the_post();
            get_template_part(\'template-parts/content\', \'wiring-diagram\');
        endwhile;

        echo \'</div>\';

        wp_reset_postdata();

    endif;

    /**Telecaster */

    if ($telecaster_query->have_posts()) :

        echo \'<h2 class="main-heading gold-line">TELECASTER WIRING DIAGRAMS:</h2>\';

        echo \'<div class="wiring-diagram-results grid-4">\';

        while ($telecaster_query->have_posts()) :
            $telecaster_query->the_post();
            get_template_part(\'template-parts/content\', \'wiring-diagram\');
        endwhile;

        echo \'</div>\';

        wp_reset_postdata();

    endif;

    /**Misc Fender */

    if ($misc_fender_query->have_posts()) :

        echo \'<h2 class="main-heading gold-line">MISC. FENDER WIRING DIAGRAMS:</h2>\';

        echo \'<div class="wiring-diagram-results grid-4">\';

        while ($misc_fender_query->have_posts()) :
            $misc_fender_query->the_post();
            get_template_part(\'template-parts/content\', \'wiring-diagram\');
        endwhile;

        echo \'</div>\';

        wp_reset_postdata();

    endif;

........etc.
有没有一种更有效的方法来编写它,从而更好地管理代码?对不起,我问了你一个问题。

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

您可以将查询配置移动到一个配置数组中,并循环该配置数组以查询帖子和呈现内容节。在内容部分中,您将有另一个帖子循环。

这里的神奇成分是第三种$args 可用于的参数get_template_part(). 使用它将数据传递到部分文件。

$configs = array(
  array(
    \'query\' => array(
      \'post_type\' => \'diagram\',
      \'tax_query\' => array(
        array(
          \'taxonomy\' => \'diagram-category\',
          \'terms\' => \'stratocaster-wiring-diagrams\',
          \'field\' => \'slug\',
        )
      )
    ),
    \'template_name\' => \'wiring-diagram\',
    \'heading\' => \'Some heading text\',
  ),
  // more configs...
);

foreach ( $configs as $config ) {
  $config[\'query\'] = new WP_Query( $config[\'query\'] );
  if ( ! $config[\'query\']->posts ) {
    continue;
  }
  
  get_template_part( \'template-parts/content-section\', null, $config );
}
第部分,

<h2 class="main-heading gold-line"><?php echo esc_html( $args[\'heading\'] ); ?></h2>
<div class="wiring-diagram-results grid-4">
  <?php
    while( $args[\'query\']->have_posts() ) {
      $args[\'query\']->the_post();
      get_template_part( \'template-parts/content\', $args[\'template_name\'] );
    }
    wp_reset_postdata();
  ?>
</div>
配置数组也可以放在单独的文件或函数中,而不必在模板文件中硬编码。

SO网友:Artemy Kaydash

将代码拆分为更小的部分。例如,可以为每个循环使用单独的模板部件。

这个get_template_part() 在您的情况下,函数可能是一个不错的选择。

相关推荐

如何设置PHPUnit PolyFill以在Mac上进行测试?

通过brew安装了带有PHP的mac开发机器。我正在尝试设置测试工具。我成功地搭建了测试脚手架wp cli并管理以获取bin/install-wp-tests.sh 做自己的事。但我有个错误phpunit tests/test-sample.php:Error: The PHPUnit Polyfills library is a requirement for running the WP test suite. If you are trying to run plugin/theme int