Customizing template with ACF, issues
This topic contains 11 replies, has 4 voices, and was last updated by Jansen Tolle 7 years, 8 months ago.
We have moved to a support ticketing system and our forums are now closed.
Open Support TicketTagged: acf, custom fields, template, theme
-
AuthorPosts
-
April 17, 2017 at 5:31 pm #373899
Hello all! I love this plugin so far, but I’m having a real tough time getting it to play nicely with Advanced Custom Fields.
Rather than relying solely on widgets, our clients prefer to have a ‘wizard’-like interface to enter content. Typically we set up a handful of custom fields and pull them into the front-end, which works great. However, I can’t get custom fields to work inside of GD!
I’m my geodir-home.php file, I’ve successfully added some wrapper HTML and other things, but when using ACF’s get_field functions, they always return nothing. I pull the same code out and plop it into another non GD page and it works as expected. Hmm.
Anyone ever run into this before?
This works
echo(get_post_meta($post->ID, “home_intro_content”, true ));This does not work
the_field( “home_intro_content”, $post->ID );However, both work just fine if I put them on a random page. I’ve verified that the ID is being pulled properly, and tried a bunch of other stuff to no avail.
April 17, 2017 at 8:01 pm #373933Hi,
as far as I know ACF is not compatible at all with GD as we use custom DB tables and PHP API that ACF is not aware of.
However I asked to the developers to check your case and let us know if they see a solution.
They’ll let us know asap.
Thanks
April 17, 2017 at 8:24 pm #373940I’m not trying to add custom fields to listings or do anything crazy. I just can’t figure out why these functions seem to .. malfunction .. while inside of the GD templates
April 19, 2017 at 5:15 pm #374293Just for further debugging purposes, I’ve tried to narrow this down a bit more by checking the output of get_field_object() at various points. It’s worth mentioning that using get_post_meta on the same custom field seems to work, but this obviously has limitations compared to ACF.
Here’s the example code
// Getting an example field from the home page. This example is being used on a non-GD page // 57 is the ID of the home page. Hard-coding it here so we can be sure there is nothing goofy about any $post->ID variables being passed in print_r (get_field_object( "home_intro_content", 57 ));
On a standard page, this works great. It tells me all the information about the field from the home page. Here’s the output:
Array ( [ID] => 331 [key] => field_58f12396b6471 [label] => Content [name] => home_intro_content [prefix] => acf [type] => textarea [value] =>
This text should introduce visitors to the website, explaining its purpose concisely. Like the “Elevator Speech” for your business. Small batch DIY gochujang mixtape bicycle rights, squid ethical authentic salvia twee banh mi cray. Sustainable migas irony, street art actually gochujang echo park edison bulb squid pinterest salvia occupy stumptown DIY 8-bit. Literally lo-fi live-edge normcore butcher woke migas, man bun kale chips blog ethical etsy vinyl. Vinyl craft beer lyft af. Explore the map below!
This text should introduce visitors to the website, explaining its purpose concisely. Like the “Elevator Speech” for your business. Small batch DIY gochujang mixtape bicycle rights, squid ethical authentic salvia twee banh mi cray. Sustainable migas irony, street art actually gochujang echo park edison bulb squid pinterest salvia occupy stumptown DIY 8-bit. Literally lo-fi live-edge normcore butcher woke migas, man bun kale chips blog ethical etsy vinyl. Vinyl craft beer lyft af. Explore the map below!
[menu_order] => 3 [instructions] => 200-ish words about the site. [required] => 1 [id] => [class] => [conditional_logic] => 0 [parent] => 323 [wrapper] => Array ( [width] => [class] => [id] => ) [_name] => home_intro_content [_prepare] => 0 [_valid] => 1 [default_value] => [placeholder] => [maxlength] => [rows] => [new_lines] => wpautop )Using this same exact code anywhere withing a GD page, the function returns a bunch of nonsense. I’ve tried this in all sorts of areas, before and after various geodir actions (eg geodir_wrapper_open). It always gives me something like this:
Array ( [ID] => 251 [key] => field_5536634644729 [label] => Columns [name] => home_intro_content [prefix] => acf [type] => repeater [value] => [menu_order] => 0 [instructions] => [required] => 1 [id] => [class] => [conditional_logic] => 0 [parent] => 250 [wrapper] => Array ( [width] => [class] => [id] => ) [_name] => multiple_columns [_prepare] => 0 [_valid] => 1 [min] => 0 [max] => 4 [layout] => table [button_label] => Add Column [collapsed] => [parent_layout] => 5536632844728 [sub_fields] => Array ( [0] => Array ( [ID] => 252 [key] => field_553663864472a [label] => Content [name] => mc_content [prefix] => acf [type] => wysiwyg [value] => [menu_order] => 0 [instructions] => [required] => 1 [id] => [class] => [conditional_logic] => 0 [parent] => 251 [wrapper] => Array ( [width] => [class] => [id] => ) [_name] => mc_content [_prepare] => 0 [_valid] => 1 [tabs] => all [toolbar] => full [media_upload] => 1 [default_value] => [delay] => 0 ) ) )
As you can see, all of the values are either blank or incorrect when using this function on a GD page. I’m wondering if, somehow, GD has a function that is blowing this up.
Any help would be appreciated – I really don’t want to have to hardcode in a bunch of stuff that will make it difficult for my clients to work on the site.
April 24, 2017 at 3:15 pm #375061Well, I figured it out and I must say I am quite astonished with some of the coding going on here. Wow…
Add this to your functions file to make this plugin work with ACF
function override_the_stupid_plugin_filters($query) { global $wp_query, $wpdb, $geodir_post_type, $table, $dist, $mylat, $mylon, $s, $snear, $s, $s_A, $s_SA; // fix woocommerce shop products filtered by language for GD + WPML + Woocommerce if (!geodir_is_geodir_page()) { return; } //----------------------_START_CUSTOMIZED CODE--------------------------- $removeFilterNicely = function($filter) { if( empty($GLOBALS['wp_filter'][$filter]) || empty($GLOBALS['wp_filter'][$filter]['callbacks']) ) { return; } foreach($GLOBALS['wp_filter'][$filter]['callbacks'] as $priority => $callbacks) { foreach($callbacks as $reference => $callback) { if( stripos($callback['function'],'ACF') !== FALSE || stripos(get_class($callback['function']), 'ACF') !== FALSE ) { unset($GLOBALS['wp_filter'][$filter]['callbacks'][$priority][$reference]); } } } }; $removeFilterNicely('query'); $removeFilterNicely('posts_search'); $removeFilterNicely('posts_fields'); $removeFilterNicely('posts_join'); $removeFilterNicely('posts_orderby'); $removeFilterNicely('posts_where'); /** remove all pre filters remove_all_filters('query'); remove_all_filters('posts_search'); remove_all_filters('posts_fields'); remove_all_filters('posts_join'); remove_all_filters('posts_orderby'); remove_all_filters('posts_where'); **/ //----------------------_END_CUSTOMIZED CODE--------------------------- if ((is_search() && isset($_REQUEST['geodir_search']) && $_REQUEST['geodir_search'] != '')): if (isset($_REQUEST['scat']) && $_REQUEST['scat'] == 'all') $_REQUEST['scat'] = ''; //if(isset($_REQUEST['s']) && $_REQUEST['s'] == '+') $_REQUEST['s'] = ''; if (isset($_REQUEST['sdist'])) { ($_REQUEST['sdist'] != '0' && $_REQUEST['sdist'] != '') ? $dist = esc_attr($_REQUEST['sdist']) : $dist = 25000; } elseif (get_option('geodir_search_dist') != '') { $dist = get_option('geodir_search_dist'); } else { $dist = 25000; } // Distance if (isset($_REQUEST['sgeo_lat'])) { $mylat = (float) esc_attr($_REQUEST['sgeo_lat']); } else { $mylat = (float) geodir_get_current_city_lat(); } // Latitude if (isset($_REQUEST['sgeo_lon'])) { $mylon = (float) esc_attr($_REQUEST['sgeo_lon']); } else { $mylon = (float) geodir_get_current_city_lng(); } // Distance if (isset($_REQUEST['snear'])) { $snear = trim(esc_attr($_REQUEST['snear'])); } if (isset($_REQUEST['s'])) { $s = trim(esc_attr(wp_strip_all_tags($_REQUEST['s']))); } if ($snear == 'NEAR ME') { $ip = $_SERVER['REMOTE_ADDR']; $addr_details = unserialize(file_get_contents('http://www.geoplugin.net/php.gp?ip=' . $ip)); $mylat = stripslashes(geodir_utf8_ucfirst($addr_details[geoplugin_latitude])); $mylon = stripslashes(geodir_utf8_ucfirst($addr_details[geoplugin_longitude])); } if (strstr($s, ',')) { $s_AA = str_replace(" ", "", $s); $s_A = explode(",", $s_AA); $s_A = implode('","', $s_A); $s_A = '"' . $s_A . '"'; } else { $s_A = '"' . $s . '"'; } if (strstr($s, ' ')) { $s_SA = explode(" ", $s); } else { $s_SA = ''; } endif; }
April 24, 2017 at 6:10 pm #375100Hi Jansen,
We reset query filters on our pages at the earliest possible time, we have our own custom table queries that can and were being broken by poor catch all filters with no specific checks.
I could go into a long explanation about it but i think u get the gist of things since you just are looping through removing just ACF ones.If you would like a full explanation or to discuss it please just ask.
Thanks,
Stiofan
April 24, 2017 at 9:29 pm #375136Yeah, I figured it out 😉
I think it would be better to use a less destructive method of removing filters if possible, this can create a lot of headaches for developers. Or at least make it clear that this is happening.
Feel free to add my code to some sort of FAQ in the docs – I guarantee I’m not the first one to run into this.
April 26, 2017 at 8:24 pm #375611Am I understanding you correctly that this additional code will allow ACF to operate as intended on GeoDirectory Front End pages and in the back end as well? Are there any performance drawbacks or otherwise that this might present?
April 26, 2017 at 8:26 pm #375614I am not certain about the backend, but yes – this does allow ACF fields to be added to pages with WPGD functinality (such as the home page).
I don’t believe there are any major performance implications
April 26, 2017 at 8:28 pm #375618Also I forgot to include this bit – can’t edit my previous comment. Have to remove the problematic action and replace it with our version.
remove_action('pre_get_posts', 'set_listing_request', 0); add_action('pre_get_posts', 'override_the_stupid_plugin_filters', 0);
April 26, 2017 at 8:32 pm #375621Does that go before or after the aforementioned code? Also would you like to collab on this in Github or something so other people can use/improve on this script?
April 27, 2017 at 6:29 pm #375798Here’s the full code, for clarification. It’d be better if the developers just merged in this fix or added a way to specify filters to exclude from their obliteration.
Pardon all of my anger that comes through in the code :p it took me HOURS to figure this out.
remove_action('pre_get_posts', 'set_listing_request', 0); add_action('pre_get_posts', 'override_the_stupid_plugin_filters', 0); /** * NOTE THIS OVERRIDES THE FUNCTION CURRECTLY USED BY THE STPUID PLUGIN BECAUSE IT DELETES ACF FUNCTIONALITY * Sets the location request parameters. * * @since 1.0.0 * * @global object $wp_query WordPress Query object. * @global object $wpdb WordPress Database object. * @global string $geodir_post_type The post type. * @global array $geodir_addon_list List of active GeoDirectory extensions. * @global string $table Listing table name. * @global float $dist Distance value to be filtered. * @global string $mylat Current latitude. * @global string $mylon Current longitude. * @global string $s Search keyword. * @global string $snear Nearest location to search. * @global string $s_A Extra parameters. * @global string $s_SA Extra parameters. */ function override_the_stupid_plugin_filters($query) { global $wp_query, $wpdb, $geodir_post_type, $table, $dist, $mylat, $mylon, $s, $snear, $s, $s_A, $s_SA; // fix woocommerce shop products filtered by language for GD + WPML + Woocommerce if (!geodir_is_geodir_page()) { return; } //----------------------_START_CUSTOMIZED CODE--------------------------- $removeFilterNicely = function($filter) { if( empty($GLOBALS['wp_filter'][$filter]) || empty($GLOBALS['wp_filter'][$filter]['callbacks']) ) { return; } foreach($GLOBALS['wp_filter'][$filter]['callbacks'] as $priority => $callbacks) { foreach($callbacks as $reference => $callback) { if( stripos($callback['function'],'ACF') !== FALSE || stripos(get_class($callback['function']), 'ACF') !== FALSE ) { unset($GLOBALS['wp_filter'][$filter]['callbacks'][$priority][$reference]); } } } }; $removeFilterNicely('query'); $removeFilterNicely('posts_search'); $removeFilterNicely('posts_fields'); $removeFilterNicely('posts_join'); $removeFilterNicely('posts_orderby'); $removeFilterNicely('posts_where'); /** remove all pre filters remove_all_filters('query'); remove_all_filters('posts_search'); remove_all_filters('posts_fields'); remove_all_filters('posts_join'); remove_all_filters('posts_orderby'); remove_all_filters('posts_where'); **/ //----------------------_END_CUSTOMIZED CODE--------------------------- if ((is_search() && isset($_REQUEST['geodir_search']) && $_REQUEST['geodir_search'] != '')): if (isset($_REQUEST['scat']) && $_REQUEST['scat'] == 'all') $_REQUEST['scat'] = ''; //if(isset($_REQUEST['s']) && $_REQUEST['s'] == '+') $_REQUEST['s'] = ''; if (isset($_REQUEST['sdist'])) { ($_REQUEST['sdist'] != '0' && $_REQUEST['sdist'] != '') ? $dist = esc_attr($_REQUEST['sdist']) : $dist = 25000; } elseif (get_option('geodir_search_dist') != '') { $dist = get_option('geodir_search_dist'); } else { $dist = 25000; } // Distance if (isset($_REQUEST['sgeo_lat'])) { $mylat = (float) esc_attr($_REQUEST['sgeo_lat']); } else { $mylat = (float) geodir_get_current_city_lat(); } // Latitude if (isset($_REQUEST['sgeo_lon'])) { $mylon = (float) esc_attr($_REQUEST['sgeo_lon']); } else { $mylon = (float) geodir_get_current_city_lng(); } // Distance if (isset($_REQUEST['snear'])) { $snear = trim(esc_attr($_REQUEST['snear'])); } if (isset($_REQUEST['s'])) { $s = trim(esc_attr(wp_strip_all_tags($_REQUEST['s']))); } if ($snear == 'NEAR ME') { $ip = $_SERVER['REMOTE_ADDR']; $addr_details = unserialize(file_get_contents('http://www.geoplugin.net/php.gp?ip=' . $ip)); $mylat = stripslashes(geodir_utf8_ucfirst($addr_details[geoplugin_latitude])); $mylon = stripslashes(geodir_utf8_ucfirst($addr_details[geoplugin_longitude])); } if (strstr($s, ',')) { $s_AA = str_replace(" ", "", $s); $s_A = explode(",", $s_AA); $s_A = implode('","', $s_A); $s_A = '"' . $s_A . '"'; } else { $s_A = '"' . $s . '"'; } if (strstr($s, ' ')) { $s_SA = explode(" ", $s); } else { $s_SA = ''; } endif; }
-
AuthorPosts
We have moved to a support ticketing system and our forums are now closed.
Open Support Ticket