WordPress的面包屑

我最近一直在使用Wordpress中的面包屑痕迹,所以我认为我可以将代码发布在这里,以防其他人发现它有用。基本思想是尝试找出当前页面在站点中的位置。这意味着与父母一起检查页面和类别。到达帖子级别后,我们需要尝试一些操作,以找出当前帖子在网站中的位置。

一旦尾迹数组中充满了项目,它就会循环遍历并转换为字符串。

要使用此功能,请将以下代码放入functions.php模板中的文件中。

<?php
/**
 * Echo or return a formatted list of breadcrumbs.
 *
 * @param  array  $args An array of arguments to controll the output of the 
 *                      function.
 * @return string       The breadcrumb list.
 */
function get_breadcrumbs($args = array())
{
    global $post;
 
    if (is_string($args)) {
        parse_str($args, $args);
    }
 
    // 设置默认值。
    $defaults = array(
        'separator'   => ' &gt; ',
        'linkFinal'   => false,
        'echo'        => true,
        'printOnHome' => true, 
        'before'      => '', 
        'after'       => '', 
    );
 
    // 将默认值与参数合并。
    $options = array_merge($defaults, (array)$args);
 
    // 使用当前帖子初始化跟踪。
    $trail = array($post);
 
    // 初始化输出。
    $output = '';
 
    $currentCategory = 0;
 
    if (is_front_page() == true && $options['printOnHome'] == false) {
        /**
         * If this is the front page and the option to prevent priting on the
         * home page is disabled then echo or return the empty string depending
         * on the echo option.
         */
        if ($options['echo'] == true) {
            echo $output;
        }
        return $output;
    }
 
    if (is_page()) {
        // 如果当前页面是页面。
        $parent = $post;
        while ($parent->post_parent) {
            $parent = get_post($parent->post_parent);
            array_unshift($trail, $parent);
        }
    } elseif (is_category()) {
        // 当前页面是类别页面。
        $trail = array();
        $currentCategory = get_query_var('cat');
        $category        = get_category($currentCategory);
        while ($category->category_parent > 0) {
            array_unshift($trail, $category);
            $category = get_category($category->category_parent);
        }
        // 将最终类别添加到路径中。
        array_unshift($trail, $category);
    } else {
        // 当前页面将是一个帖子或一组帖子。
        $path = explode('/', $_SERVER['REQUEST_URI']);
        $path = array_filter($path);
        while (count($path) > 0) {
            $page = get_page_by_path(implode('/', $path));
            if ($page != NULL) {
                array_unshift($trail, $page);
            }
            array_pop($path);
        }
 
        if (count($trail) == 1) {
            // 在路径中找不到页面,请尝试使用类别。
            $category = get_the_category();
            $category = $category[0];
            while ($category->category_parent > 0) {
                array_unshift($trail, $category);
                $category = get_category($category->category_parent);
            }
            array_unshift($trail, $category);
        }
    }
 
    $show_on_front = get_option('show_on_front');
    if ('posts' == $show_on_front) {
        // 主页是帖子列表,因此将其称为“主页”。
        $output .= '<li id="breadcrumb-0"><a href="' . get_bloginfo('home') . '" title="Home">Home</a></li>' . "\n"; // 主页链接
    } else {
        // 否则首页是页面,请获取页面名称。
        $page_on_front = get_option('page_on_front');
        $home_page = get_post($page_on_front);
        $output .= '<li id="breadcrumb-' . $home_page->ID . '"><a href="' . get_bloginfo('home') . '" title="' . $home_page->post_title . '">' . $home_page->post_title . '</a></li>' . "\n"; // 主页链接
        if ($trail[0]->ID == $page_on_front) {
            array_shift($trail);
        }
    }
 
    if (is_front_page() == false) {
        // 如果我们不在主页上,则构建输出。 
        foreach ($trail as $key => $page) {
            // 跟踪中的每个项目都将是一个帖子/页面对象或一个类别。
            if (count($trail) - 1 == $key && $options['linkFinal'] == false) {
                // 如果我们在最后一页上,并且链接选项为true。
                if (isset($page->post_title)) {
                    $output .= '<li id="breadcrumb-' . $page->ID . '">' . $options['separator'] . ' ' . $page->post_title . '</li>' . "\n";
                } elseif (isset($page->cat_name)) {
                    $output .= '<li id="breadcrumb-cat-' . $page->term_id . '">' . $options['separator'] . ' ' . $page->cat_name . '</li>' . "\n";
                }
            } else {
                // 创建指向页面或类别的链接
                if (isset($page->post_title)) {
                    $output .= '<li id="breadcrumb-' . $page->ID . '">' . $options['separator'] . '<a href="' . get_page_link($page->ID) . '" title="' . $page->post_title . '">' . $page->post_title . '</a></li>' . "\n";
                } elseif (isset($page->cat_name)) {
                    $output .= '<li id="breadcrumb-cat-' . $page->term_id . '">' . $options['separator'] . '<a href="' . get_category_link($page->term_id) . '" title="' . $page->cat_name . '">' . $page->cat_name . '</a></li>' . "\n";
                }
            }
        }
    }
 
    // 完成ul的html
    $output = "<ul>\n" . $output . "</ul>\n";
 
    // 添加其他元素
    $output = $options['before'] . $output .  $options['after'];
 
    if ($options['echo'] == true) {
        // 打印$output变量。
        echo $output;
    }
    // 返回 
    return $output;
}

像这样在页面上打印出痕迹:

也有几个选项可用于更改功能的工作方式。这些如下:

  • 分隔符:分隔面包屑路径中各项的字符串,默认为>。

  • linkFinal:是否将最后一个链接打印为链接。默认为false。

  • echo:是否在函数中打印出面包屑。默认为true。

  • printOnHome:在主页上打印面包屑。默认为true。

您可以get_breadcrumbs()使用与普通Wordpress功能几乎相同的方式来设置功能选项。可以通过这样的参数字符串或数组来实现。

<?php
get_breadcrumbs(
    array(
        'separator'   => ' &gt; ',
        'linkFinal'   => false,
        'echo'        => true,
        'printOnHome' => false, 
    )
);
?>

这将打印出类似以下内容的内容:

<ul> 
<li id="breadcrumb-0"><a href="http://www.example.com/wordpress_test" title="Home">Home</a></li> 
<li id="breadcrumb-174"> &gt; <a href="http://www.example.com/wordpress_test/level-1" title="Level 1">Level 1</a></li> 
<li id="breadcrumb-173"> &gt; <a href="http://www.example.com/wordpress_test/level-1/level-2" title="Level 2">Level 2</a></li> 
<li id="breadcrumb-172"> &gt;  Level 3</li> 
</ul>

因为Wordpress是可以以多种不同方式设置的那些应用程序之一,所以我试图解决尽可能多的情况。但是,如果您尝试使用此面包屑功能,但无法正常工作,请在此处发表评论,并告诉我。

更新:添加到面包屑输出字符串的选项之前和之后。