2016-07-01 3 views
0

私の顧客は、ローカルと外部の両方の他のページへのリンクを手作業で書いているので、メインページの一種として機能する「ギャラリー」というページを持つWordpressブログを持っています。ワードプレスの別のページの祖先ページを強制する

ブログのメインメニューには、このギャラリーページへのリンクもあります。問題は、あらかじめギャラリーを親ページとして選択していない限り、そのページのメニュー項目のみがアクティブであることです。

私は、メニューをレンダリングする前に特定の条件を満たすページに祖先を仮想的に強制することができますか(フック付きで)、手動ですべてのページを編集し、 "ギャラリー"

答えて

0

は、最後にそれを行う方法が見つかりました:

$main_gallery_page= get_page_by_title('Galleries'); 

add_filter('nav_menu_css_class' , 'force_ancestor_nav_class' , 10 , 2); 

function force_ancestor_nav_class($classes, $item){ 
    global $main_gallery_page,$post; 

    //condition: could be any condition: by category, title, contents, ... 
    $make_ancestor=substr($post->post_title, 0, 7) === "Gallery"; 

    //only adds the class if the condition is met and not already present 
    if ($item->object_id==$main_gallery_page->ID && $make_ancestor && !in_array('current-page-ancestor',$classes)) {$classes[]='current-page-ancestor';} 

    return $classes; 
} 
1

メニューデータを組み立てるのは非常に早い段階で機能するフィルタを見つけたり、すでに構築されている重いアレイジャグリングを行う必要があります。

  1. 更新単純なデータベースクエリを経由して、すべての現在既存のページの親:私は別のアプローチをお勧めしたい

    wp_postsにはカラムpost_parentが含まれていますので、あなたが言及した基準を満たすすべてのページをフィルタリングするクエリを作成してください(条件が何であるかによって決まりますか?wp_postmeta、wp_termsなどの他のテーブルとのJOINが関係する可能性があります)それらの親を更新します。これは一度限りのものなので、phpMyAdminやそのようなデータベースのフロントエンドで行うことができます。 「ページ」は内部的には一般的なもので、同じテーブルに保存されているため、最初はページである投稿のみをフィルタリングする必要があります。

  2. ポスト保存/更新アクションにフックする関数を作成し、条件が一致するかどうかを再度チェックし、そうであればPHPデータ構造内のそのポイントの親ページを設定しますデータベースに書き込まれます。

関連する問題