-
Notifications
You must be signed in to change notification settings - Fork 57
/
acf-page-ancestor-location-rule.php
58 lines (55 loc) · 1.84 KB
/
acf-page-ancestor-location-rule.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<?php
/*
ACF custom location rule : Page Ancestor
*/
add_filter('acf/location/rule_types', 'acf_location_rules_page_ancestor');
function acf_location_rules_page_ancestor($choices) {
$choices['Page']['page_ancestor'] = 'Page Ancestor';
return $choices;
}
add_filter('acf/location/rule_values/page_ancestor', 'acf_location_rules_values_page_ancestor');
function acf_location_rules_values_page_ancestor($choices) {
// this code is copied directly from
// render_location_values()
// case "page"
$groups = acf_get_grouped_posts(array(
'post_type' => 'page'
));
if (!empty($groups)) {
foreach(array_keys($groups) as $group_title) {
$posts = acf_extract_var($groups, $group_title);
foreach(array_keys($posts) as $post_id) {
$posts[$post_id] = acf_get_post_title($posts[$post_id]);
};
$choices = $posts;
}
}
// end of copy from ACF
return $choices;
}
add_filter('acf/location/rule_match/page_ancestor', 'acf_location_rules_match_page_ancestor', 10, 3);
function acf_location_rules_match_page_ancestor($match, $rule, $options) {
// this code is with inspiration from
// acf_location::rule_match_page_parent()
// check parents recursively to see if any
// matches the location value
if (isset($options['page_parent']) && $options['page_parent']) {
$page_parent = $options['page_parent'];
unset($options['page_parent']);
} elseif (isset($options['post_id']) && $options['post_id']) {
$post = get_post($options['post_id']);
$page_parent = $post->post_parent;
}
$ancestors = array();
if ($page_parent) {
$ancestors = get_ancestors($page_parent, 'page');
$ancestors[] = $page_parent;
}
if ($rule['operator'] == "==") {
$match = in_array($rule['value'], $ancestors);
} elseif ($rule['operator'] == "!=") {
$match = !in_array($rule['value'], $ancestors);
}
return $match;
}
?>