サポート » 使い方全般 » Newマークの表示

  • 解決済 pyonko

    (@pyonko)


    (1)カスタムメニューに表示した固定ページに「New」マークを表示する
     その1:新規作成したページをメニューのトップレベルに置く場合
     その2:新規作成したページにトップレベルの親ページがある場合は、トップレベルにある親ページにも表示するとともに、当該新規作成ページにも表示する
    (2)カスタムメニューに表示したカテゴリー・アーカイブに「New」マークを表示する
     この場合も(1)とほぼ同様に、新着記事を含む子カテゴリーと、親カテゴリーに表示する

    以上はカスタムメニューに表示する場合についてですが、もしこれが難しい場合、
    (3)サイドバー・ウィジェットにおいて、wp_list_caregories()関数を使用し、例えば「show_last_updated」オプションをカスタマイズすることにより、同様なことを実現したいのです。(ウィジェットには直接phpコードを書けるプラグインを使用しています。)

    全てできればやりたいところですが、一部でも実施したいと思っています。どうかご教示をよろしくお願いいたします。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • 以下をテーマの functions.php に書けばOK◎
    ※(3)は「カスタムメニューウィジェット」を使えば良いです。

    add_filter( 'wp_nav_menu_objects', 'my_nav_menu_objects', 10, 2 );
    function my_set_new_to_ancestor( $items, $item_id ) {
    	if ( 0 == $item_id )
    		return;
    
    	foreach ( $items as $item ) {
    		if ( $item_id == $item->ID ) {
    			my_set_new_to_ancestor( $items , $item->menu_item_parent );
    			$item->new = true;
    		}
    	}
    }
    
    function my_nav_menu_objects( $sorted_menu_items, $args ) {
    	global $wpdb;
    
    	$post_ids = (array) $wpdb->get_col( $wpdb->prepare( "
    		SELECT p.ID FROM $wpdb->posts as p
    		WHERE p.post_type IN ( 'post', 'page' ) AND p.post_status = 'publish'
    		AND TO_DAYS(NOW()) - TO_DAYS(p.post_date) <= %d
    		", 7 /* 何日前までを New とするかを指定します */
    	) );
    
    	$cat_ids = wp_get_object_terms( $post_ids, 'category', array( 'fields' => 'ids' ) );
    
    	if ( ! empty( $post_ids ) ) {
    		foreach ( $sorted_menu_items as &$item ) {
    			switch ( $item->object ) {
    				case 'page':
    					if ( in_array( $item->object_id, $post_ids ) )
    						$item->new = true;
    					break;
    				case 'category':
    					if ( in_array( $item->object_id, $cat_ids ) )
    						$item->new = true;
    					break;
    			}
    
    			if ( isset( $item->new ) )
    				my_set_new_to_ancestor( $sorted_menu_items, $item->menu_item_parent );
    		}
    	}
    
    	return $sorted_menu_items;
    }
    
    add_filter( 'walker_nav_menu_start_el', 'my_walker_nav_menu_start_el', 10, 4 );
    function my_walker_nav_menu_start_el( $item_output, $item, $depth, $args ) {
    	if ( isset( $item->new ) ) {
    		// New の表示の仕方はお好みで。
    		$item_output = preg_replace( '@</a>@', ' new</a>', $item_output );
    	}
    	return $item_output;
    }
    トピック投稿者 pyonko

    (@pyonko)

    ありがとうございます!
    早速、先ずは(1),(2)について、ということでfunctions.phpに追加しました。
    しかし、カスタムメニューには変化がありませんでした。(1月5日と6日の投稿がある「ニュース」カテゴリーがありますが、newが出ません)

    当方は、twentytenによる「子テーマ」を使用しています。位置に関係するかどうか不明ですが、まずは子テーマのfunctions.phpの末尾に追加しました。

    違っている点、忘れている点があるのかもしれません。よろしくお願いいたします。

    トピック投稿者 pyonko

    (@pyonko)

    ありがとうございました。出ています!
    スタイルを指定していなかったため、通常のタイトルと同じカラーだったため、気づきにくかっただけでした。

    誠にありがとうございました。

    ちなみに、カスタム投稿タイプのアーカイブにも同様なことを実施する場合は、 WHERE p.post_type IN ( 'post', 'page' )
    に、’post_type’を追加することでよいでしょうか?

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • トピック「Newマークの表示」には新たに返信することはできません。