我的客户有一个Wordpress博客,其中有一个名为“画廊”的页面,作为一种主页面,因为他手动将链接写入本地和外部的其他页面。
博客的主菜单还有一个指向此图库页面的链接。问题是该菜单项仅对该页面有效,但不对链接的本地页面有效,除非您之前选择了“库”作为其父页面。
所以我想知道是否有可能(带钩子)在呈现菜单之前虚拟强制祖先到满足某些条件的页面,从而避免手动编辑每个页面并使其成为子节点“画廊“
答案 0 :(得分:1)
你必须找到一个过滤器,它可以在组装菜单数据的最初阶段工作,或者在它已经构建完成后进行一些重排杂乱。
我建议采用另一种方法:
通过简单的数据库查询更新所有当前现有页面的父级。 wp_posts
包含一列post_parent
- 因此请创建一个查询,过滤掉您提到的满足您提到的条件的所有网页(这将是多么容易或多么困难,取决于您的标准 - 可能涉及JOINs与其他表如wp_postmeta,wp_terms),然后更新那些表。这是一次性的事情,所以可以通过phpMyAdmin或类似的数据库前端来完成。请记住,因为"页面"在内部是普通帖子,并存储在同一个表格中,您必须首先过滤那些作为页面的帖子。
创建一个挂钩到保存/更新操作的函数,再次检查条件是否匹配,如果是,则在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;
}