How to disable the custom database table queries when using ACF Custom Database Tables version 1.0.x

We recently had a request as to how you could prevent ACF Custom Database Tables from querying custom table data when using ACF’s get_field() function.

This isn’t something we had built-in but for anyone needing to implement this, you can use the following code to achieve exactly that.

A few things to keep in mind:

  1. This will ONLY work with versions 1.0.x as our service container and core object methods are changing in version 1.1.
  2. This approach calls directly upon our service container which is something that you shouldn’t get into the habit of doing unless you:
    1. Really know what you are doing and;
    2. Thoroughly test plugin updates in a non-production environment before releasing them. This is particularly important because our service container is not an API and is subject to change as the plugin evolves.
<?php
use ACFCustomDatabaseTables\Intercept\ACFGetFieldIntercept;
use ACFCustomDatabaseTables\Vendor\Pimple\Container;
/**
* Class ACFCDTvOneDotZeroDotAnyGetFieldInterceptBypass
*
* This provides a 'hotfixed' approach for disabling custom database table intercept when using ACF's get_field()
* function. This will only work with version 1.0.x versions of the plugin as a built-in tool will be available in
* version 1.1 and beyond.
*/
class ACFCDTvOneDotZeroDotAnyGetFieldInterceptBypass {
/**
* Disables the get field intercept allowing data retrieval from core meta tables only.
*/
public static function enable() {
if ( $instance = self::get_instance() ) {
remove_filter( 'acf/pre_load_value', [ $instance, 'fetch_value' ], 10 );
}
}
/**
* Enables the get field intercept allowing data retrieval from custom database tables.
*/
public static function disable() {
if ( $instance = self::get_instance() and ! has_filter( 'acf/pre_load_value', [ $instance, 'fetch_value' ] ) ) {
add_filter( 'acf/pre_load_value', [ $instance, 'fetch_value' ], 10, 3 );
}
}
/**
* Fetches the get field intercept instance, if available.
*
* @return ACFGetFieldIntercept|null
*/
private static function get_instance() {
$plugin = acf_custom_database_tables();
if ( ! method_exists( $plugin, 'container' ) ) {
return null;
}
$container = $plugin->container();
if ( ! $container instanceof Container ) {
return null;
}
$intercept_instance = $container['acf_get_field_intercept'];
if ( ! $intercept_instance instanceof ACFGetFieldIntercept ) {
return null;
}
return $intercept_instance;
}
}
<?php
require 'ACFCDTvOneDotZeroDotAnyGetFieldInterceptBypass.php';
// EXAMPLE 1:
// To disable get field intercepts entirely – which means all data is retreived from core meta
// tables only – you could simply call the following from your functions.php file or a
// configuration plugin:
ACFCDTvOneDotZeroDotAnyGetFieldInterceptBypass::enable();
// EXAMPLE 2:
// IF, however, you are in a template and only want to bypass certain fields as you call them,
// you can turn the bypass on and off as follows:
the_field('some_field'); // custom table will be queried
ACFCDTvOneDotZeroDotAnyGetFieldInterceptBypass::enable();
the_field('some_other_field'); // custom table won't be queried
ACFCDTvOneDotZeroDotAnyGetFieldInterceptBypass::disable();
the_field('some_third_field'); // custom table will be queried
view raw usage.php hosted with ❤ by GitHub