GeoDirectory stores custom field values in its own table for each post type, not in WordPress post meta, so get_post_meta() returns nothing for them. Use geodir_get_post_meta() with the listing ID and the field key:
$instagram = geodir_get_post_meta( $post_id, 'instagram', true );
The key is the Key setting of the field in Places > Settings > Custom Fields. In GeoDirectory v1 custom field keys started with geodir_, for example geodir_instagram. The upgrade to v2 removed that prefix, so use the key exactly as the field settings show it.
Get all fields of a listing at once
geodir_get_post_info() returns an object with every field of the listing, which is handy when you need several values:
$listing = geodir_get_post_info( $post_id );
if ( ! empty( $listing->instagram ) ) {
echo esc_html( $listing->instagram );
}
On a listing detail page and inside GeoDirectory loops, the global $gd_post already holds that object for the current listing:
global $gd_post;
if ( ! empty( $gd_post->instagram ) ) {
echo esc_html( $gd_post->instagram );
}
Showing a value without code
If you only want to display the value on a page, the GD > Post Meta block does it without PHP. Show set to “value (saved in database)” outputs the raw stored value:
[gd_post_meta key='instagram' show='value-raw']
See How can I display a custom field database value? for more on that.