Join the Voxel Guide Community!

Get Involved

Address Mod to Morten's PHP code

Description/Instructions

This is an alternative version of Morten Lindorf’s snippet, “Control Which Parts Of A Location String Is Shown.”

It’s use case specific – I needed to reliably show the “city, state” or “city, province” for USA and Canadian locations without using any type of manual intervention from the user. I also wanted to strip off post codes for a cleaner presentation.

Instructions

This is an alternative version of Morten Lindorf's snippet, "Control Which Parts Of
A Location String Is Shown."

It's use case specific - I needed to reliably show the "city, state"
or "city, province" for USA and Canadian locations without using any type of
manual intervention from the user.

I also wanted to strip off post codes for a cleaner presentation.

/*
* Customization of Morten Lindorf's code snippet to pull values from the google 
* location field using the google location Long Address, this will pull out
* the city, state or city, province. * It will also strip off the postal codes from both US and Canadian addresses. * Use the modifier of -2, -1 to get the City, State or City, Province. */
add_filter( 'voxel/dynamic-tags/modifiers', function( $modifiers ) {   class Get_Address_Parts extends \Voxel\Dynamic_Tags\Base_Modifier {     public function get_label(): string {       return 'Get address parts';     }     public function get_key(): string {       return 'get_address_parts';     }     public function get_arguments(): array {       return [         'parts' => [           'type' => \Voxel\Form_Models\Text_Model::class,           'label' => _x( 'Enter parts, e.g. 1,3', 'modifiers', 'voxel-backend' ),           'classes' => 'x-col-12',         ],       ];     }     public function apply( $value, $args, $group ) {       $parts = explode( ', ', $value );       $requested = array_filter( array_map( 'intval', explode( ',', $args[0] ?? '' ) ) );       // Check if the last item is "United States" or "Canada"       $last_item = trim(end($parts));       if ($last_item === 'United States' || $last_item === 'Canada') {         // Drop the last item         array_pop($parts);       }       // Check if the string contains a Canadian postal code (A1A 1A1)       if (preg_match('/[A-Z]\d[A-Z]\s\d[A-Z]\d/', $value)) {         // Remove the Canadian postal code from the string         $parts = array_map(function($part) {           return preg_replace('/[A-Z]\d[A-Z]\s\d[A-Z]\d/', '', $part);         }, $parts);       } else {         // Remove numbers from the end of each part         $parts = array_map(function($part) {           return preg_replace('/\d+$/', '', $part);         }, $parts);       }       // Filter and map requested parts       return join( ', ', array_filter( array_map( function( $i ) use ( $parts ) {         return $i < 0 ? ( $parts[ count( $parts ) + $i ] ?? null ) : ( $parts[ $i - 1 ] ?? null );       }, $requested ) ) );     }   }   $modifiers['get_address_parts'] = \Get_Address_Parts::class;   return $modifiers; });
  • PHP
Copy Code

Let's Chat About this Snippet

Chat Toggle
Voxel Guide AI
Voxel Guide AI
Voxel Guide AI
Voxel Guide AI
Ask me anything about Voxel!
Send
Powered by AI24