CPT:如果POST中的图像超过X个,请使用分页

时间:2013-05-24 作者:Bram Vanroy

在我的网站上,我有一个自定义的帖子类型(“foto”)。它包含使用Facebook照片获取程序(插件)从Facebook获取的相册。这很有效。不幸的是,这个插件不允许分页。在包含大量图像的页面上,这可能会导致问题(verrrrryyyy加载时间过长),例如here.

因为我使用的是CPT,所以似乎可以使用分页。不幸的是,我以前从未使用过分页,也不知道如何实现它。它是在cpt的声明中,还是一个不同的函数?我怎样才能让它只在帖子有超过X张图片的情况下工作呢?

我想应该创建一个模板single-fotos.php 它与默认的不同之处在于它使用分页。我不知道当有超过X个图像时如何显示分页。

根据马修的答案,我尝试了几件事。与其尝试构建自定义的帖子类型,不如编辑插件。

我添加了以下行:

// Look for Next page tag in starttag
        if( preg_match(\'/next=(\\d+)/\', $retVal[\'startTag\'], $matches) )      $retVal[\'next\']      =$matches[1];

...

// Add default value of next to defaults array
            $defaults = array(\'cols\'    => 6,               //Number of columns of images (aka Number of images per row)
                              ...
                              \'next\'    => 42);               // Can be any number, but preferably a multitude of \'more\'

...

// Output photos AND other tags such as more tag and next page
    foreach($photos as $photo)
        {
            //Output this photo (must get rid of [], or WP will try to run it as shortcode)
            ...
            $link = \'<a rel="shadowbox[\' . $aid . \']" class="fbPhoto" href="\'.$photo->source . \'" title="\'.$caption_with_br.\' " ><img src="\' . $photo->picture . \'" alt="" /></a>\';
            $retVal[\'content\'] .= "<dl class=\'gallery-item\' style=\\"width:$itemwidth%\\">";
            $retVal[\'content\'] .= "<dt class=\'gallery-icon\'>$link</dt>";
            ...
            $retVal[\'content\'] .= "</dl>\\n";

            //Move on to the next row?
            if( $params[\'cols\'] > 0 && ++$i % $params[\'cols\'] == 0 ) $retVal[\'content\'] .= "<br style=\\"clear: both\\" />\\n\\n";
            //Insert a more tag?
            if( $params[\'more\'] > 0 && $i == $params[\'more\'] ) $retVal[\'content\'] .= "<!--more-->\\n\\n";
            //Insert a next page tag?
            if( $params[\'next\'] > 0 && $i == $params[\'next\'] ) $retVal[\'content\'] .= "<!--nextpage-->\\n\\n";
        }
        if( $i%$params[\'cols\'] != 0 ) $retVal[\'content\'] .= "<br style=\\"clear: both\\" />\\n\\n";
        $retVal[\'content\'] .= "</div>\\n";
问题是,下一页标签只渲染一次!在42张照片(默认)之后,将插入下一个标记,但在接下来的42张照片之后,不会再次渲染。我认为这很正常,但我对PHP不够熟悉,无法实现从n=1开始对给定值(如果不是,则为默认值)的每次乘法都进行渲染。如何做到这一点?

编辑2请注意,这应该与more 标记和分页不应显示在代码段中。我也是not 希望this 在代码段中。此外,注释和响应字段只能放在最后一页上。

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

尝试

$u = 0;
foreach($photos as $photo) {
$u++;

...

  if( ($params[\'next\'] > 0 && $u == $params[\'next\']) ) {
    $retVal[\'content\'] .= "<!--nextpage-->\\n\\n";
    $u = 0;
  }
在OP发布的代码中编辑(解释)$params[\'next\'] > 0 && $i == $params[\'next\'] 假设$i 每一个周期递增一次(这在代码中不可见,但可以通过直觉得到)$i > $params[\'next\'] 这不起作用,下一个内容只添加一次。

在我的代码中,使用$u = 0 添加后<!--nextpage-->\\n\\n 它应该可以工作,因为foreach再次递增$u,所以我的代码if( $params[\'next\'] > 0 && $u == $params[\'next\'] ) { 应适用于$params[\'next\']的每一个倍数。

SO网友:Matthew Boynes

我不熟悉这个插件,但从源代码来看,我认为你可以这样做(EDIT: This doesn\'t work, because the plugin bails if there is more than one tag per post, see below for a similar approach):

<!--FBGallery2 1234567890123456789 start=0 max=20 --><!--/FBGallery2-->

<!--nextpage-->

<!--FBGallery2 1234567890123456789 start=20 max=20 --><!--/FBGallery2-->

<!--nextpage-->

<!--FBGallery2 1234567890123456789 start=40 max=20 --><!--/FBGallery2-->

<!--nextpage-->

<!--FBGallery2 1234567890123456789 start=60 max=20 --><!--/FBGallery2-->

<!--nextpage-->

<!--FBGallery2 1234567890123456789 start=80 max=20 --><!--/FBGallery2-->
然后使用page links 给柱子分页。

下一步是将操作添加到wp_insert_post_data 在插件执行之前(使用较低优先级的数字,如5),截取更通用的标记版本(不分页)。在插件之前运行API查找以找出项目数,然后像上面那样以编程方式将其分解。

编辑如评论中所述,插件在每篇文章中识别的标签不超过一个。那我们就换一种方式吧。它使用的“魔术标签”允许列化。它计算“单元格”的数量并插入<br style="clear: both" />. 如果您不需要换行符(因为您可以使用纯CSS来完成同样的事情),可以将其替换为<!--nextpage--> 标签下面是一个这样做的示例:

function wpse_100654_split_fb_album( $content ) {
    return str_replace( \'<br style="clear: both" />\', \'<!--nextpage-->\', $content );
}
add_action( \'wp_insert_post_data\', \'wpse_100654_split_fb_album\', 15 );
如果确实需要该换行符,请计算出每页所需的行数,并用下一页标记替换每一个nth换行符。

结束

相关推荐

Pagination stops at page 6

下面的循环工作得很好,除了分页总是在第6页停止之外。无论我指定什么参数,它都不会显示超过6页的内容。有人知道为什么吗?<?php $paged = (get_query_var(\'paged\')) ? get_query_var(\'paged\') : 1; $idxargs = array( \'posts_per_page\' => \'1\', \'paged\' =>