Home › Forums › General Issues › Trouble with acf/fields/post_object/query Filter
Hello,
I am attempting to use a Post Object field to represent a relationship between Posts of the same type.
I am using acf_form to render the form on the front end of my site.
When I render an ‘Edit’ Form ( by passing the post_id in to acf_form) the post I am trying to edit appears in the Post Object Field Select, which is undesirable.
I would like to use the acf/fields/post_object/query filter so my form only renders these posts.
Here is a sample of the code I have tried:
add_filter( 'acf/fields/post_object/query/name=my_field', [ $this, 'my_filter' ] );
public function my_filter( $args, $field, $post_id ) {
$field; // Undefined
$post_id; // Undefined
if(isset($post_id)) {
$args['post__not_in'] = [$post_id];
}
return $args;
}
The filter is called at the right time, but the $field and $post_id parameters are not set.
post__not_in
should be an array, so that’s the first suggested change
add_filter( 'acf/fields/post_object/query/name=my_field', [ $this, 'my_filter' ] );
public function my_filter( $args, $field, $post_id ) {
$field; // Undefined
$post_id; // Undefined
if(isset($post_id)) {
$args['post__not_in'] = array([$post_id]);
}
return $args;
}
If this field is a sub field of a repeater or flex field you also need to use the field key for adding the filter.
In my example $post__not_in is an array. But this is not the issue.
The filter is called at the right time, but the $field and $post_id parameters are not set. It is not a subfield of a repeater field.
sorry, I missed the obvious, and not talking about the array, I personally never use shorthand for anything so I missed that too.
But what I missed is your add_filter() code. If you want more than 1 argument passed to your filter then you need to tell WP how many is should pass. In this case it should be 3
add_filter( 'acf/fields/post_object/query/name=my_field', [ $this, 'my_filter' ], 10, 3 );
Thank you for your reply John,
$post_id is now set, but it is always set to 0.
Possibly this is because I am using AJAX to load the form as described in this link.
https://www.advancedcustomfields.com/resources/acf_form/#ajax
I did some code tracing and here is the $_POST variable.
[
action => "acf/fields/post_object/query",
nonce => "c35b1d6bc1",
paged => "1",
s => "",
field_key => "field_588bcb6648c75"
]
Because post_id is not set it defaults to 0 as defined in acf_field_post_object->get_ajax_query()
Is this by design?
EDIT:
When I do this query from wp_admin, the post_id IS set.
Yes, I’d say that has something to do with it.
I’m not sure what direction to go with that information. You somehow need to set the post id. Without knowing more about what you’re doing, and really just guessing here…
well, I’ve started to type several suggestions and removed them. As I think about them as I start typing I run into road blocks. The main problem here is that the ajax request is being done by ACF. You somehow need to find a way to make ACF send the correct post ID during the request. I’ve done a lot with custom AJAX queries for ACF fields, but I’ve never been able to alter the AJAX requests that ACF is already doing.
There is only one thing that I can think of and that would be to pass the post ID in your ajax request and use that to set the post ID value when calling acf_form(), and I haven’t got a clue if this will work. But if it does then maybe ACF will either pass the correct post ID or it might be available in $_POST.
Ended up using this post to solve my problem
Thank you for your help John
I don’t remember that post or the comments that followed mine, but it was interesting. Hopefully I remember it the next time I’m looking for something similar.
Hi, could you tell me what is 10 & 3 from
add_filter( 'acf/fields/post_object/query/name=my_field', [ $this, 'my_filter' ], 10, 3 );
10 is the priority of the filter and 3 is the number of variables to be passed to the function. https://developer.wordpress.org/reference/functions/add_filter/
The topic ‘Trouble with acf/fields/post_object/query Filter’ is closed to new replies.
Welcome to the Advanced Custom Fields community forum.
Browse through ideas, snippets of code, questions and answers between fellow ACF users
Helping others is a great way to earn karma, gain badges and help ACF development!
We use cookies to offer you a better browsing experience, analyze site traffic and personalize content. Read about how we use cookies and how you can control them in our Privacy Policy. If you continue to use this site, you consent to our use of cookies.