动态链接到页面模板中的最新帖子或模拟特定帖子的请求

时间:2012-07-27 作者:Pascal Rosin

我想在wordpress菜单中有一个链接,指向特定类别的最新帖子。

因为我无法在wordpress菜单中放置动态URL,所以我的方法是在菜单中放置一个带有自定义页面模板的页面。

此页面模板的行为应类似于主题single.php 但显示给定类别的最后一篇文章。

有没有一种方法可以包含主题single.php 并模拟特定职位的请求?

我试图复制single.php 并使用修改查询

query_posts( array( \'cat\' => 9993, \'showposts\' => 1) );
如果我以前那样做the_header(), 那我就没有帖子了。如果我以后再做the_header(), 然后我得到了正确的内容,但主题的标题将设置一些特定的类来设置页面样式。所以我需要the_header() 函数可以认为请求了所需的帖子,而不是页面。

Update:我没有完全使用toscho的解决方案,因为我没有突出显示活动菜单项并将其置于正确的位置。但他用wp_nav_menu_objects 滤器

我有一个主菜单项CategoryX,它可以直接打开CategoryX中的最新帖子,还可以打开一个子菜单,其中包含指向旧帖子和其他相关内容的链接。子菜单中还应该有一个指向最新帖子(LatestFromX)的链接,在主菜单中单击CategoryX后,也应该直接突出显示该链接。

我基本上做的是:用WP admin后端创建虚拟菜单项,然后用filter函数替换其URL。

function wp_menu_add_last_from_category_x( $sorted_menu_items, $args ) {   
    global $wp;

    // get url of latest article in CategoryX (CategoryX has id 9993):
    $latest = get_posts( array( \'numberposts\' => 1, \'category\' => 9993 ) ); 
    $latest_url = get_permalink($latest[0]->ID);

    // search for the dummy menu items and replace the url:
    foreach ($sorted_menu_items as $key => $item) {
        if ($item->title === \'CategoryX\' || $item->title === \'LatestFromX\') {
            $sorted_menu_items[$key]->url = $latest_url;
            if ($wp->request == $latest[0]->post_name) {
                $sorted_menu_items[$key]->classes[] = "current-menu-item";
            }
        }
    }

    return $sorted_menu_items;
}

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

您可以筛选wp_nav_menu_objects 并添加新项目。下面是一个简单的插件:

<?php # -*- coding: utf-8 -*-
/**
 * Plugin Name: Latest Post In Menu
 * Description: Append a link to the latest post to all nav menus called with the argument <code>\'add_latest_post\' => TRUE</code>.
 * Plugin URI:  http://wordpress.stackexchange.com/q/59892/73
 * Version:     2012.07
 * Author:      Thomas Scholz
 * Author URI:  http://toscho.de
 * License:     MIT
 * License URI: http://www.opensource.org/licenses/mit-license.php
 */

add_filter( \'wp_nav_menu_objects\', \'wpse_59892_latest_post_in_nav_menu\', 10, 2 );

/**
 * Add a link to the latest post to the nav menu.
 *
 * The nav menu has to be called with \'add_latest_post\' => TRUE.
 * Example:
 * wp_nav_menu(
 *  array(
 *      \'theme_location\' => \'primary\',
 *      \'add_latest_post\' => TRUE
 *  )
 * );
 *
 * @wp-hook wp_nav_menu_objects
 * @param   array $sorted_menu_items Existing menu items
 * @param   object $args Nav menu arguments as object.
 * @return  array
 */
function wpse_59892_latest_post_in_nav_menu( $sorted_menu_items, $args )
{
    if ( ! isset ( $args->add_latest_post )                    // argument set?
        or ! $args->add_latest_post                           // argument TRUE?
        or ! $latest = get_posts( array ( \'numberposts\' => 1 ) ) // post found?
    )
    {
        return $sorted_menu_items;
    }

    // Uncomment the following line to see what you can change:
    // print \'<pre>\' . htmlspecialchars( var_export( $sorted_menu_items, TRUE ) ) . \'</pre>\';

    $post    = $latest[0];
    $content = empty ( $post->post_excerpt ) ? $post->post_content : $post->post_excerpt;
    $link    = array (
        \'title\'            => $post->post_title,
        \'menu_item_parent\' => 0,
        \'ID\'               => \'\',
        \'db_id\'            => \'\',
        \'url\'              => get_permalink( $post->ID ),
        \'classes\'          => array (
                0 => \'\',
                1 => \'menu-item\',
                2 => \'menu-item-type-post_type\',
                3 => \'menu-item-object-post\',
                4 => \'latest-post\',
            ),
        // strips all tags and reduces the length to 20 words
        \'attr_title\'       => wp_trim_words( $content, 20 ),
    );

    $sorted_menu_items[] = (object) $link;

    return $sorted_menu_items;
}
如果我们写一篇新文章…

enter image description here

…然后像这样调用导航菜单…

wp_nav_menu( 
    array( 
        \'theme_location\'  => \'primary\', 
        \'add_latest_post\' => TRUE 
    ) 
);
…我们得到…

enter image description here

导航菜单项有一个类latest-post, 因此,我们可以根据CSS设置样式:

.menu .latest-post a
{
    color: #eee;
    background: #9f0;
}

结束