acf-fields-in-custom-table icon indicating copy to clipboard operation
acf-fields-in-custom-table copied to clipboard

API is not reflected

Open Nowi5 opened this issue 4 years ago • 1 comments
trafficstars

Hi,

I faced an issue, that when I use ACF via Rest API (https://github.com/airesvsg/acf-to-rest-api) I get a 200 but the new values are not reflected. 3 hours later I spotted the issue, that via the API the acf fields in custom table events are not triggered and no values were visible in the database. So here is the solution:

acf-fields-in-custom-table.php - add a new filter - line ~80 add_filter( 'acf/update_value', [$this, 'update_field_in_custom_table'], 11, 3 );

Add new function at line ~181:

public function update_field_in_custom_table($value, $post_id, $field){		
		 global $wpdb;
		
		if($field["readonly"]){
			return;
		}
		
		if (
          $field[self::SETTINGS_ENABLED] && $field['name'] &&
          $this->is_supported($field)
        ){		
			$column_name 	= acfict_sanitize_keyword($field['name']);
			$table_name 	= $this->table_name($field[self::SETTINGS_TABLE_NAME], $field[self::SETTINGS_USE_PREFIX]);
			$dbvalue 		= apply_filters('acfict_sanitize_'.$field['type'],$value,$field);
			
			$wpdb->update($table_name, [$column_name => $dbvalue], ['post_id' => $post_id]);		
		}
		
		return $value;
	}

See https://www.advancedcustomfields.com/resources/acf-update_value/ for more information on this filter.

Please be aware, that with this issue, we add the entries to the table in addition to the meta table. If you have an alternative solution, please let me know.

Thank you.

Nowi5 avatar Oct 22 '21 21:10 Nowi5

Updated a bit, as new entries need beside an update also an insert:

	public function update_field_in_custom_table($value, $post_id, $field){		
		 global $wpdb;
		
		if($field["readonly"]){
			return;
		}
		
		if (
          $field[self::SETTINGS_ENABLED] && $field['name'] &&
          $this->is_supported($field)
        ){		
			$column_name = acfict_sanitize_keyword($field['name']);
			$table_name = $this->table_name($field[self::SETTINGS_TABLE_NAME], $field[self::SETTINGS_USE_PREFIX]);
			$dbvalue = apply_filters('acfict_sanitize_'.$field['type'],$value,$field);
			$data = ['post_id' => $post_id, $column_name => $dbvalue];
			
			$sql = "INSERT INTO $table_name (post_id,$column_name) VALUES (%d,%s) ON DUPLICATE KEY UPDATE $column_name = %s";
			$sql = $wpdb->prepare($sql,$post_id,$dbvalue,$dbvalue);			
		
			$wpdb->suppress_errors = true;
			$wpdb->show_errors = false;

			if ( false  === $wpdb->query($sql)){
				$message = __('ACF: Fields in Custom Table error:', 'acfict').$wpdb->last_error;
				acfict_admin_notice_add($message, 'error');
			}
		
		}
		
		return $value;
	}

Nowi5 avatar Oct 22 '21 23:10 Nowi5