强制祖先页面在wordpress中的另一个页面

时间:2016-07-01 16:11:34

标签: php wordpress

我的客户有一个Wordpress博客,其中有一个名为“画廊”的页面,作为一种主页面,因为他手动将链接写入本地和外部的其他页面。

博客的主菜单还有一个指向此图库页面的链接。问题是该菜单项仅对该页面有效,但不对链接的本地页面有效,除非您之前选择了“库”作为其父页面。

所以我想知道是否有可能(带钩子)在呈现菜单之前虚拟强制祖先到满足某些条件的页面,从而避免手动编辑每个页面并使其成为子节点“画廊“

2 个答案:

答案 0 :(得分:1)

你必须找到一个过滤器,它可以在组装菜单数据的最初阶段工作,或者在它已经构建完成后进行一些重排杂乱。

我建议采用另一种方法:

  1. 通过简单的数据库查询更新所有当前现有页面的父级。 wp_posts包含一列post_parent - 因此请创建一个查询,过滤掉您提到的满足您提到的条件的所有网页(这将是多么容易或多么困难,取决于您的标准 - 可能涉及JOINs与其他表如wp_postmeta,wp_terms),然后更新那些表。这是一次性的事情,所以可以通过phpMyAdmin或类似的数据库前端来完成。请记住,因为"页面"在内部是普通帖子,并存储在同一个表格中,您必须首先过滤那些作为页面的帖子。

  2. 创建一个挂钩到保存/更新操作的函数,再次检查条件是否匹配,如果是,则在PHP数据结构中设置帖子的父页面,之前被写入数据库。

答案 1 :(得分: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;
}