web-dev-qa-db-ja.com

最新の投稿に動的にリンクするか、ページテンプレート内の特定の投稿の要求をシミュレートします。

特定のカテゴリの最新の投稿を指すリンクをワードプレスメニューに表示したいです。

私は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;
}
4
Pascal Rosin

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;
}
5
fuxia

またはこのプラグインを使ってください。 wp_nav_menuのコーディングは不要です。

https://de.wordpress.org/plugins/dynamic-latest-post-in-nav-menu/ /

https://github.com/hijiriworld/dynamic-latest-post-in-nav-menu

0
mahal tertin