Hi All,
I am looking for a script that will only show search results from one page and all of its children.
I have been using the following working code to <strong>exclude</strong> an ID from the search.php results. However:
- I need to the script to either <strong>INCLUDE</strong> instead of <strong>EXCLUDE</strong> an ID and all of its children or
- give me the ability to exclude more than one ID and their children.
$parent = 1041; // 'n' for the ID of the parent page to exclude - I need to find a way to list more than one
$children_data = get_pages( array(
'child_of' => $parent,
'post_type' => 'page'
) );
$excludes = array($parent);
foreach( $children_data as $child ) {
array_push($excludes, $child->ID);
}
global $wp_query;
query_posts(
array_merge(
array('post__in' => $excludes),
$wp_query->query
)
);
if (have_posts()) : ...etc
Cheers
Arnav Joy answers:
try this with all of your code
<?php
$parent = array(1041,1042,1043,1044); // 'n' for the ID of the parent page to exclude - I need to find a way to list more than one
for($i = 0;$i<count($parent); $i++) {
$children_data = get_pages( array(
'child_of' => $parent[$i],
'post_type' => 'page'
) );
$excludes = array($parent[$i]);
foreach( $children_data as $child ) {
array_push($excludes, $child->ID);
}
}
?>
Arnav Joy comments:
// you can alos try following code in functions.php and nothing needed in search.php then
function filter_where($where = '') {
if ( is_search() ) {
$parent = array(1041,1042,1043,1044);
for($i = 0;$i<count($parent); $i++) {
$children_data = get_pages( array(
'child_of' => $parent[$i],
'post_type' => 'page'
) );
$excludes = array($parent[$i]);
foreach( $children_data as $child ) {
array_push($excludes, $child->ID);
}
}
for($x=0;$x<count($excludes);$x++){
$where .= " AND ID != ".$excludes[$x];
}
}
return $where;
}
add_filter('posts_where', 'filter_where');
Arnav Joy comments:
<?php
// FOR INCLUDE ONLY SINGLE PAGE AND ITS CHILD PAGE YOU CAN TRY FOLLOWING CODE IN FUNCTIONS.PHP AND REMOVE ALL THE CODE FROM SEARCH.PHP
function filter_where($where = '') {
if ( is_search() ) {
$parent = 1041;
$children_data = get_pages( array(
'child_of' => $parent,
'post_type' => 'page'
) );
$include = array($parent);
foreach( $children_data as $child ) {
array_push($include, $child->ID);
}
$includeIDS = @implode(',',$include);
$where .= " AND ID IN( ".$includeIDS." )";
}
return $where;
}
add_filter('posts_where', 'filter_where');
?>
Arnav Joy comments:
//here is another query which works with excluding more then one pages and child pages , let me know if you want include query
// search filter
function fb_search_filter($query) {
if ( !$query->is_admin && $query->is_search) {
$pages = array(2, 40, 9); // id of page or post
// find children to id
foreach( $pages as $page ) {
$childrens = get_pages( array('child_of' => $page, 'echo' => 0) );
}
// add id to array
for($i = 0; $i < sizeof($childrens); ++$i) {
$pages[] = $childrens[$i]->ID;
}
$query->set('post__not_in', $pages );
}
return $query;
}
add_filter( 'pre_get_posts', 'fb_search_filter' );
leannekera comments:
Sorry Arnav the code doesn't seem to make any difference. I do need the code to be added via the template as I will be having different search results for each page.
So each page/section has its own specific search.
Arnav Joy comments:
then try this in your page
<?php
$parent = 1041; //or $parent = get_the_ID(); // to get the current page id
$children_data = get_pages( array('child_of' => $parent,'post_type' => 'page') );
$includes = array($parent);
foreach( $children_data as $child )
array_push($includes, $child->ID);
query_posts(array('post__in' => $includes , 'post_type' => 'page'));
if (have_posts()) : ...etc
?>
leannekera comments:
I'm getting a server error page... cant see the issue.
leannekera comments:
Got it working and it works! ARNAV YOU ARE A LEGEND!
Arnav Joy comments:
try this or can you show me the url
<?php
$parent = 1041;
//or to get the current page id
//$parent = get_the_ID();
$children_data = get_pages( array('child_of' => $parent,'post_type' => 'page') );
$includes = array($parent);
foreach( $children_data as $child )
array_push($includes, $child->ID);
query_posts(array('post__in' => $includes , 'post_type' => 'page'));
if (have_posts()) :
while(have_posts()) : the_post();
the_title();
endwhile
endif;
?>
Arnav Joy comments:
Thanks , leannekera
do not forget to vote
Francisco Javier Carazo Gil answers:
If you have an array with all posts (or all his IDs) and another array with only excluded posts, you can make a diff between them:
http://es.php.net/manual/es/function.array-diff.php
Hai Bui answers:
I don't understand. Your current code seems to limit the search results to an a page and its children, NOT <strong>exclude</strong> them from search results, how can it <strong>exclude</strong> posts with "post__in" parameter??
Sébastien | French WordpressDesigner answers:
to exclude an array, juste use 'post__not_in' => array(264, 234),
in this case page 264 & 234are excluded
Sébastien | French WordpressDesigner comments:
so : just replace post__in by post__not_in
easy ! :-)
leannekera comments:
Yeah I thought that but my first attempt didn't work... give me a sec I will try again.
Sébastien | French WordpressDesigner comments:
use this code if your code doesn't work
$parent = 1041; // 'n' for the ID of the parent page to exclude - I need to find a way to list more than one
$children_data = get_pages( array(
'child_of' => $parent,
'post_type' => 'page'
) );
$excludes = array();
$excludes[] = $parent;
foreach( $children_data as $child ) {
$excludes[] = $child->ID;
}
global $wp_query;
query_posts('post__not_in' => $excludes);
if (have_posts()) : ...etc
leannekera comments:
I changed the code to the following and it still shows results from ID 1041 and 1042. Ideally I want it to show the results from 1042 and its children only but even if I change the ID it still shows them...
if (have_posts()) :
$args = array(
'post_type' => 'page',
'post__not_in' => array(1041,1042),
);
query_posts( $args ); ?>