特定のカテゴリの最新の投稿を指すリンクをワードプレスメニューに表示したいです。
私はWordpressのメニューに動的なURLを入れることができないので、私のアプローチはメニューにカスタムページテンプレートを含むページを入れることでした。
このページテンプレートはテーマsingle.php
のように振る舞うべきですが、与えられたカテゴリからの最後の投稿を示しています。
テーマsingle.php
を含めて特定の投稿のリクエストをシミュレートする方法はありますか?
ページテンプレートのsingle.php
の内容をコピーして、クエリを次のように変更してみました。
query_posts( array( 'cat' => 9993, 'showposts' => 1) );
私がthe_header()
の前にそうするならば、私はポストを得ません。私がthe_header()
の後にそれをするならば、私は正しい内容を得ますが、テーマのヘッダはページをスタイルするためのいくつかの特定のクラスを設定するでしょう。そのため、私はthe_header()
関数が必要で、ページではなく希望の投稿が要求されたと考えます。
更新: /私はtoschoによる解決法を完全には使っていませんでした。アクティブなメニュー項目がハイライトされ、正しい位置に表示されなかったからです。しかし彼は私を正しい方向にwp_nav_menu_objects
フィルタで指し示しました。
私はメインメニュー項目CategoryXを持っていました。これはCategoryXからの最新の投稿を直接開き、さらに古い投稿へのリンクや他の関連するものを含むサブメニューを開きます。サブメニューには、最新のPost(LatestFromX)へのリンクもあります。メインメニューのCategoryXをクリックした直後にも強調表示されます。
私が基本的にしたことは、WP adminバックエンドを使ってダミーのメニュー項目を作成し、その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;
}
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;
}
新しい記事を書くと…
…そしてこのようにナビゲーションメニューを呼び出します…
wp_nav_menu(
array(
'theme_location' => 'primary',
'add_latest_post' => TRUE
)
);
… 我々が得る …
ナビゲーションメニュー項目はクラスlatest-post
を持っているので、CSSごとにそれをスタイルすることができます:
.menu .latest-post a
{
color: #eee;
background: #9f0;
}
またはこのプラグインを使ってください。 wp_nav_menuのコーディングは不要です。
https://de.wordpress.org/plugins/dynamic-latest-post-in-nav-menu/ /
https://github.com/hijiriworld/dynamic-latest-post-in-nav-menu