Blog

WordPress: 子页面上下页面链接获取函数

这个一开始不知道如何表达,简单来说就像文章(post)的上一篇、下一篇链接。这是最近忙的一个小主题需要的功能。

一般文章(single.php)里面的上一篇文章链接获取函数是 previous_post_link(),下一篇文章链接获取 next_post_link() (注:要在 loop 里面),当然如果放到页面里面(page.php),也能工作,只是不能满足我下面说的需求。

需求

页面有分级功能,需求是按 menu order 排序的子级页面之间有上一篇、下一篇链接,如:

Themes(父级页面)
---- zBench(子级页面1)
---- zBorder(子级页面2)
---- zSofa(子级页面3)

如果当前页面是 zBorder,那么就要上一篇链接是 zBench 的,下一篇链接是 zSofa 的。

【实现函数代码】

把下面函数代码放入 functions.php(注:函数随手写的,可能不够精简)

/**
 * get subpage previous/next page link by zwwooooo
 */
function subpage_nav_link($prevText='', $nextText='') {
	global $post;
	if ( !$post->post_parent ) return null; //如果不是子页面返回Null
	$args = array(
		'sort_order' => 'ASC',
		'sort_column' => 'menu_order',
		'child_of' => $post->post_parent,
		'post_type' => 'page'
	);
	$pages = get_pages($args);
	$num = count($pages);
	$i = 0;
	$index = -1;
	foreach ($pages as $page) {
		if ($page->ID == $post->ID) {
			$index = $i;
			break;
		}
		++$i;
	}
	if ($i == 0) {
		$prev = '';
		$next = $pages[$index+1];
	} elseif ($i == $num-1) {
		$prev = $pages[$index-1];
		$next = '';
	} else {
		$prev = $pages[$index-1];
		$next = $pages[$index+1];
	}
	if ($prev) {
		if ($prevText) {
			if ( substr_count($prevText, '%title') > 0 ) {
				$explode = explode('%title', $prevText);
				$prevText = $explode[0] . get_the_title($prev->ID) . $explode[1];
			}
		} else {
			$prevText = get_the_title($prev->ID);
		}
		$prevlink = '<a class="previous-page-link" href="' . get_page_link($prev->ID). '">' . $prevText . '</a>';
	}
	if ($next) {
		if ($nextText) {
			if ( substr_count($nextText, '%title') > 0 ) {
				$explode = explode('%title', $nextText);
				$nextText = $explode[0] . get_the_title($next->ID) . $explode[1];
			}
		} else {
			$nextText = get_the_title($next->ID);
		}
		$nextlink = '<a class="next-page-link" href="' . get_page_link($next->ID). '">' . $nextText . '</a>';
	}
	return array($prevlink, $nextlink);
}

【用法】

[函数]

subpage_nav_link($prevText, $nextText)

[参数]

$prevText: 为前一篇文章链接文字,为空时默认是页面标题
$nextText: 为下一篇文章链接文字,为空时默认是页面标题;

例如:一般的主题是在 page.php 的 loop 循环里面(不知道就在 the_content(); 下面吧)插入调用代码

<?php
if ( function_exists('subpage_nav_link') ) {
	if ( $subpage_nav_link = subpage_nav_link() ) {
		echo $subpage_nav_link[0]; //上一篇(页面)链接
		echo $subpage_nav_link[1]; //下一篇(页面)链接
	}
}
?>

注:可以用 if (!$subpage_nav_link[0]) 来判断有没有上一篇,同样 if (!$subpage_nav_link[1]) 来判断有没有下一篇。

PS: $prevText 和 $nextText 还支持字符组合,如 subpage_nav_link('oo %title xx', '') 这样的话,前一篇文章链接文章会变成“oo 页面名 xx”

以上,继续忙。

zww
or
oooo

声明: 除非注明,ZWWoOoOo文章均为原创,转载请以链接形式标明本文地址
本文地址: https://zww.me/the-previous-and-next-page-link-function-in-sub-page.z-turn

21 comments

  1. XBAO XBAO Google Chrome 37 Google Chrome 37 Mac OS X 10.9 Mac OS X 10.9

    这个功能看似不错,实际运用的少

    沙发
    • zwwooooo zwwooooo Firefox 32 Firefox 32 Windows 8.1 Windows 8.1

      @XBAO
      博客的话基本用不到吧,cms类网站可能会需要

  2. axiu axiu Google Chrome 36 Google Chrome 36 Windows 7 Windows 7

    板凳……

    板凳
  3. 所谓刚子 所谓刚子 Google Chrome 36 Google Chrome 36 Windows 7 Windows 7

    我占 我占!!!!

    地板
  4. 甜菜 甜菜 Sogou Explorer Sogou Explorer Windows 8.1 Windows 8.1

    只有四楼了...

    4楼
  5. 郑永 郑永 Firefox 31 Firefox 31 Windows XP Windows XP

    先收藏一下吧,以后可能会用到,呵呵。

    5楼
  6. 郑永 郑永 Firefox 31 Firefox 31 Windows XP Windows XP

    最近都没去折腾主题了,这算终于停止更换的欲望了。

    6楼
  7. kn007 kn007 Google Chrome 36 Google Chrome 36 Windows 7 Windows 7

    前排

    7楼
  8. Aricou Aricou Google Chrome 36 Google Chrome 36 Windows 8.1 Windows 8.1

    先收藏,留着以后需要用

    8楼
  9. 毕扬 毕扬 Google Chrome 36 Google Chrome 36 Mac OS X 10.9 Mac OS X 10.9

    ZWW老师博学多才,博大精深

    9楼
  10. 咚门 咚门 Google Chrome 36 Google Chrome 36 Windows 8.1 Windows 8.1

    其实我才知道wordpress还有子页面的功能,以前真的没有用到过。

    10楼
  11. Jesse Jesse Google Chrome 31 Google Chrome 31 Windows 7 Windows 7

    :!:
    真羡慕,这么会写代码,我想实现同父分类a子分类文章末一篇跳转到b子分类第一篇,并且b子分类第一篇跳转到a子分类末一篇的功能(写文章只勾选子分类),可惜代码基础差,怎么写怎么错,搜索了N多,你这个还接近点儿 :cry: :cry:

    11楼
    • zwwooooo zwwooooo Firefox 33 Firefox 33 Windows 8.1 Windows 8.1

      @Jesse
      只要在子分类首尾2篇文章做个判断:如a子分类最后一篇做个判断,然后让“下一篇”链接变成b子分类页面。b子分类第一篇亦然。记得要统一排序方式。

    • Jesse Jesse Firefox 35 Firefox 35 Windows 7 Windows 7

      @zwwooooo
      这个算法我能理解,只是我几乎完全不会写代码 :cry: 。而且自己写的会和wp自带的上一篇、下一篇有功能重复部分,更觉得太难了,如果能像这篇文章里一样,直接再每篇文章插入 $prevText 和 $nextText ,不插系统自带的就更简洁完美了。

    • zwwooooo zwwooooo Firefox 35 Firefox 35 Windows 8.1 Windows 8.1

      @Jesse
      这……那我没办法特意去给你写,还是自己慢慢折腾研究下吧...或者换个方式吧

  12. Shrek Shrek Firefox 39 Firefox 39 Windows XP Windows XP

    遇到了一个难题:如何获取相同format的上下文链接?

    12楼
    • zwwooooo zwwooooo Firefox 40 Firefox 40 Windows 10 Windows 10

      @Shrek
      这...,太忙,没办法帮你,看看 wordpress codex 的函数吧

Leave a Reply