在不使用PRE_GET_POST的情况下运行主查询之前对其进行修改

时间:2017-08-15 作者:CrossB

我有2个张贴区显示在每页。

首先是小部件(它位于每个页面的顶部)。

第二个是posts区域(显示在小部件下方)。

它是独立的查询。小部件上的文章是另一个查询,帖子区域上的文章是主查询。

所以,我不希望这两个区域都有相同的文章(不是重复的),并且小部件上的文章是随机显示的。

我想使用我从小部件获得的文章id来修改主查询。

例如:我有文章id号1、4和10,我想用它来修改主查询,使其不加载要显示的文章id。

我得到了$array_widgetId 来自另一个文件,该文件有一个循环来显示小部件中的文章(另一个查询),我将其设置为全局变量,并在该文件中定义它,该文件用于在帖子区域中显示文章(此处为主查询),还修改主查询以从加载中排除该文章id。

while(have_posts()){

    the_post();
    //article to show in the posts area.
}
如果不使用pre_get_posts?

因为我试图传递要在中使用的小部件id数组function.php 但这是不可能的。

更多信息:我有很多文件可以让这个东西工作(可能这就是为什么维护它让我如此困惑的原因)。

我有一个文件来循环文章以生成列。

warp framework布局中的“\\u posts.php”

 $column_order = $this[\'config\']->get(\'multicolumns_order\', 1); 
    $colcount = is_front_page() ? $this[\'config\']->get(\'multicolumns\', 1) : 1;
    $widget_id (this array contains id of article which show on the widget kit)
            while (have_posts()) {
              the_post();
                 if (isset($widget_id) && !in_array($post->ID, $widget_id)) {
               if ($column_order == 0) {
                    // order down
                    if ($row >= $rows) {
                        $column++;
                        $row = 0;
                        $rows = ceil(($count - $i) / ($colcount - $column));
                    }
                    $row++;
                } else {
                    // order across
                    $column = $i % $colcount;
                }

                if (!isset($columns[$column])) {
                    $columns[$column] = \'\';
                }
                $columns[$column] .= $this->render(\'_post\', array(\'is_column_item\'  => ($colcount > 1)));


                $i++;
                if ($i == $default_posts_per_page) {
                    break 1; // break out \'while\' loop level
                }
             }
          }
         // render columns
         if ($count = count($columns)) {
            echo \'<div class="uk-grid" data-uk-grid-match data-uk-grid-margin>\';
            for ($i = 0; $i < $count; $i++) {
                echo \'<div class="uk-width-medium-1-\' . $count . \'">\' . 
         $columns[$i] . \'</div>\';
            }
            echo \'</div>\';
        }else{
           // generate standard column
        }
以上代码将在后端生成以下设置的列。在此之后,它将调用“\\u post.php”,并且“\\u post.php”将包含自定义布局的HTML标记。

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

与其尝试设置全局变量,不如对小部件和其他内容使用主查询。只需调整循环即可。

如果您共享更多的代码,也许我们可以帮助您指定这将转到何处,但一般的想法是将循环的开头移到需要显示小部件的任何位置。使用计数器跟踪是否在循环第一个项目(如果是,则在小部件中显示)或不循环(在主内容区域中显示)。

<?php get_header();
//
// your code - perhaps an outer container div, etc.
//
$counter=0; // set a counter
if(have_posts()): // start of normal Loop
while(have_posts()): the_post();
$counter++; // increment counter at each iteration
if($counter==1) { // only for first Post
    ?><div class="sidebar">
        <div class="widget">
            <?php the_title(); // add link, etc. as desired ?>
        </div>
    </div><?php
} else { // now show the rest of the Posts outside of the widget
    ?>
        <div class="maincontent">
            <?php the_title(); the_content(); // format as desired ?>
        </div>
    <?php
}
endwhile;
endif; // end Loop
//
// your code - perhaps an outer container div, etc.
//
get_footer(); ?>

SO网友:inarilo

在循环中,您可以通过检查帖子ID是否在小部件帖子ID数组中来排除这些帖子:

while(have_posts()){
  if(!in_array($post->ID, $array_widgetId)) {
    the_post();
  }
}

结束

相关推荐

有没有办法通过unctions.php在模板中“在页面上”推送javascript或css?

我的意思是,当我在函数中“enqueue\\u scripts”以将CSS或JS加载到模板中时,它会添加完整路径。我想做的是将Javascript实际发布到实际页面上,以便在页面上按如下方式推送它:<script> the javascript is printed ON the page NOT a Full Path </script> 我知道这有一个插件,但我想知道是否有一个更简单的\'功能。php的做法。。。换句话说,我正在努力加快网站的速度,也就是说,我正在尝试