在单个帖子页面中获取帖子偏移量/帖子页面偏移量(循环外)

时间:2013-12-10 作者:risk

我想知道如何在get\\u posts循环之外获取自定义帖子或其页面的偏移量。

我开发了一个外部web应用程序,它通过JSON API插件连接到wordpress博客,并使用AJAX请求显示给定的帖子页面,如:

?json=get_posts&orderby=date&order=desc&count=x&page=n
(这将返回第n页,共x篇帖子)

这很好,但现在我想在wordpress博客“single post”页面上设置一个指向此应用程序的链接,如“在应用程序中显示此帖子”,并将当前页面偏移量作为参数。因此,我将能够在应用程序中读取此参数,并获取包含此帖子的页面帖子,并突出显示此帖子(作为参数发送)。

如果我可以得到偏移量,我将能够使用模运算符显示右侧页面:

如果偏移量=22且计数=10,则显示第3页并突出显示第2号立柱

page = Math.ceil(offset / count);
post_to_highlight_position = offset % count;
你知道我怎么做吗?或者是否有更好的方法来实现这一点?

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

感谢您的回答,我终于成功地通过自定义SQL查询实现了我想要的功能:)

我是如何做到这一点的:首先,我通过添加以下代码获得了使用WP\\u query生成的SQL查询:

$query = new WP_Query( $query_args );

//write the SQL query
echo $query->request;
我得到的是:

SELECT wp_posts.ID 
FROM wp_posts 
WHERE 1=1 
AND wp_posts.post_type = \'work\' 
AND (wp_posts.post_status = \'publish\') 
ORDER BY wp_posts.post_date DESC
它返回按最新优先顺序排列的帖子的完整列表。然后我添加了offset 只需声明一个偏移量变量并在每一行中递增,如下所示:

SET @offset=0;
SELECT wp_posts.ID, 
       @offset := @offset + 1 AS offset
FROM wp_posts 
WHERE 1=1 
AND wp_posts.post_type = \'work\' 
AND (wp_posts.post_status = \'publish\') 
ORDER BY wp_posts.post_date DESC
最后一步,我按post ID过滤了这个ID+偏移量关联列表,并添加了自定义行(pageposition) :

SET @offset=0;
SELECT ID, 
       offset - 1 AS offset, 
       CEIL(offset / 10) AS page,
       (offset - 1) % 10 AS position
FROM (SELECT wp_posts.ID, 
      @offset := @offset + 1 AS offset
      FROM wp_posts 
      WHERE 1=1 
      AND wp_posts.post_type = \'work\' 
      AND (wp_posts.post_status = \'publish\') 
      ORDER BY wp_posts.post_date DESC) 
      AS OFFSETS
WHERE ID = 83
(其中83是搜索的帖子ID,10是每页的帖子数量)

我用过offset - 1 AS offset 从0获取偏移,但可以使用offset 从1获取偏移。

因此,这将返回以下表格:

id=83,每页帖子=10:

ID | offset | page | position
83 |   16   |  2   |    6    
->第2页第6位

id=10,每页帖子数=5:

ID | offset | page | position
10 |   33   |  7   |    3    
->第7页第3位

我希望这会对某人有所帮助!:)

SO网友:temkin

我认为您无法在循环之外获得页面的偏移量,因为它将脱离上下文。偏移量可能会有所不同,具体取决于用于获取循环帖子的参数。

最简单的解决方案是在应用程序中计算偏移量。您需要将post\\u id作为一个属性传递,然后遍历通过?json=get_posts&orderby=date&order=desc&count=x&page=n 并将其ID与作为属性得到的ID进行比较。

希望它有意义。

SO网友:s_ha_dum

“偏移量”取决于查询(排序顺序、类别或标记等条件、元查询等),并且每次将帖子添加到博客时都会发生变化。与其说是你“得到”的东西,不如说是你计算出来的东西。

在“单篇文章”页面上,查询非常简单,并返回一篇文章——即偏移量为0。假设您想要的是归档中的偏移量,那么您必须运行归档查询(使用任何适用的参数)并循环搜索结果,直到找到您想要的帖子。这是服务器上相当重的负载。

有一个相当复杂的查询--不知道它是否有效:https://stackoverflow.com/q/3614666/1735890 你必须把它转换成WordPress。

SO网友:Jon Hendershot

这是一个稍微不同的问题集,我不知道它有多活跃,但我在尝试解决类似的问题时遇到了它,我想向将来可能遇到这篇文章的任何人分享我的解决方案。

我基本上认为我需要按照temkin在回答中描述的那样处理这些信息。我将此函数添加到我的函数中。php文件,然后在我的单曲中调用它。php文件,并将其存储为$page\\u number变量。因为我现在有了正确的页码,所以我可以将其附加到链接中的存档后URL。

请注意,您只需要更新查询$args,以反映存档页正在使用的相同参数。

In functions.php

function get_archive_page_num( $post_id ){

$post_type = get_post_type( $post_id );
$index = \'\';
$archive_page_number = \'\';
$per_page = get_option(\'posts_per_page\');

$args = array(
    \'post_type\' => $post_type,
    \'posts_per_page\' => -1,
    \'orderby\' => \'date\',
    \'order\' => \'DESC\'
);

$posts = get_posts( $args );
foreach($posts as $key=>$post){
    $this_id = $post->ID;

    if($this_id === $post_id){
        $index = $key;
        $archive_page_number = ceil( $index / $per_page );
    }
}

    return $archive_page_number;    
}

In whatever file you need the pagination link for - single.php, for example

$post_id = $post->ID
$post_page = get_archive_page_num( $post_id );
$link = get_post_type_archive_link( $post->post_type );


echo "<a href=\'$link/page/$post_page>Back to Archive</a>";
这至少会为您提供正确的页码。如果您想返回并在特定帖子上显示页面,只需添加ID 属性添加到每个使用$post->ID 并从单个页面附加一个锚定标记。添加内容如下所示:

$post_id = $post->ID
$post_page = get_archive_page_num( $post_id );
$link = get_post_type_archive_link( $post->post_type );
$post_anchor = "post-$post_id";

echo "<a href=\'$link/page/$post_page/#$post_anchor>Back to Archive</a>";
如果$post->ID = 1234, 这将锚定到存档页面上的元素id="post-1234", 如果存在。希望这对别人有帮助!

结束

相关推荐

Permalink for pages

正如您所知,我们可以根据需要更改后永久链接/%postname%.htm -->/mypostname.htm 我们也可以对页面执行同样的操作吗?/%pagename%.htm -->/mypagename.htm 当我们为帖子使用自定义永久链接时,页面的永久链接为%pagename%。