or any other object type with an associated meta table. * @param string $meta_key Meta key. */ $args = apply_filters( 'register_meta_args', $args, $defaults, $object_type, $meta_key ); $args = wp_parse_args( $args, $defaults ); // Require an item schema when registering array meta. if ( false !== $args['show_in_rest'] && 'array' === $args['type'] ) { if ( ! is_array( $args['show_in_rest'] ) || ! isset( $args['show_in_rest']['schema']['items'] ) ) { _doing_it_wrong( __FUNCTION__, __( 'When registering an "array" meta type to show in the REST API, you must specify the schema for each array item in "show_in_rest.schema.items".' ), '5.3.0' ); return false; } } $object_subtype = ! empty( $args['object_subtype'] ) ? $args['object_subtype'] : ''; // If `auth_callback` is not provided, fall back to `is_protected_meta()`. if ( empty( $args['auth_callback'] ) ) { if ( is_protected_meta( $meta_key, $object_type ) ) { $args['auth_callback'] = '__return_false'; } else { $args['auth_callback'] = '__return_true'; } } // Back-compat: old sanitize and auth callbacks are applied to all of an object type. if ( is_callable( $args['sanitize_callback'] ) ) { if ( ! empty( $object_subtype ) ) { add_filter( "sanitize_{$object_type}_meta_{$meta_key}_for_{$object_subtype}", $args['sanitize_callback'], 10, 4 ); } else { add_filter( "sanitize_{$object_type}_meta_{$meta_key}", $args['sanitize_callback'], 10, 3 ); } } if ( is_callable( $args['auth_callback'] ) ) { if ( ! empty( $object_subtype ) ) { add_filter( "auth_{$object_type}_meta_{$meta_key}_for_{$object_subtype}", $args['auth_callback'], 10, 6 ); } else { add_filter( "auth_{$object_type}_meta_{$meta_key}", $args['auth_callback'], 10, 6 ); } } // Global registry only contains meta keys registered with the array of arguments added in 4.6.0. if ( ! $has_old_auth_cb && ! $has_old_sanitize_cb ) { unset( $args['object_subtype'] ); $wp_meta_keys[ $object_type ][ $object_subtype ][ $meta_key ] = $args; return true; } return false; } /** * Checks if a meta key is registered. * * @since 4.6.0 * @since 4.9.8 The `$object_subtype` parameter was added. * * @param string $object_type Type of object metadata is for. Accepts 'post', 'comment', 'term', 'user', * or any other object type with an associated meta table. * @param string $meta_key Metadata key. * @param string $object_subtype Optional. The subtype of the object type. * @return bool True if the meta key is registered to the object type and, if provided, * the object subtype. False if not. */ function registered_meta_key_exists( $object_type, $meta_key, $object_subtype = '' ) { $meta_keys = get_registered_meta_keys( $object_type, $object_subtype ); return isset( $meta_keys[ $meta_key ] ); } /** * Unregisters a meta key from the list of registered keys. * * @since 4.6.0 * @since 4.9.8 The `$object_subtype` parameter was added. * * @param string $object_type Type of object metadata is for. Accepts 'post', 'comment', 'term', 'user', * or any other object type with an associated meta table. * @param string $meta_key Metadata key. * @param string $object_subtype Optional. The subtype of the object type. * @return bool True if successful. False if the meta key was not registered. */ function unregister_meta_key( $object_type, $meta_key, $object_subtype = '' ) { global $wp_meta_keys; if ( ! registered_meta_key_exists( $object_type, $meta_key, $object_subtype ) ) { return false; } $args = $wp_meta_keys[ $object_type ][ $object_subtype ][ $meta_key ]; if ( isset( $args['sanitize_callback'] ) && is_callable( $args['sanitize_callback'] ) ) { if ( ! empty( $object_subtype ) ) { remove_filter( "sanitize_{$object_type}_meta_{$meta_key}_for_{$object_subtype}", $args['sanitize_callback'] ); } else { remove_filter( "sanitize_{$object_type}_meta_{$meta_key}", $args['sanitize_callback'] ); } } if ( isset( $args['auth_callback'] ) && is_callable( $args['auth_callback'] ) ) { if ( ! empty( $object_subtype ) ) { remove_filter( "auth_{$object_type}_meta_{$meta_key}_for_{$object_subtype}", $args['auth_callback'] ); } else { remove_filter( "auth_{$object_type}_meta_{$meta_key}", $args['auth_callback'] ); } } unset( $wp_meta_keys[ $object_type ][ $object_subtype ][ $meta_key ] ); // Do some clean up. if ( empty( $wp_meta_keys[ $object_type ][ $object_subtype ] ) ) { unset( $wp_meta_keys[ $object_type ][ $object_subtype ] ); } if ( empty( $wp_meta_keys[ $object_type ] ) ) { unset( $wp_meta_keys[ $object_type ] ); } return true; } /** * Retrieves a list of registered meta keys for an object type. * * @since 4.6.0 * @since 4.9.8 The `$object_subtype` parameter was added. * * @param string $object_type Type of object metadata is for. Accepts 'post', 'comment', 'term', 'user', * or any other object type with an associated meta table. * @param string $object_subtype Optional. The subtype of the object type. * @return string[] List of registered meta keys. */ function get_registered_meta_keys( $object_type, $object_subtype = '' ) { global $wp_meta_keys; if ( ! is_array( $wp_meta_keys ) || ! isset( $wp_meta_keys[ $object_type ] ) || ! isset( $wp_meta_keys[ $object_type ][ $object_subtype ] ) ) { return array(); } return $wp_meta_keys[ $object_type ][ $object_subtype ]; } /** * Retrieves registered metadata for a specified object. * * The results include both meta that is registered specifically for the * object's subtype and meta that is registered for the entire object type. * * @since 4.6.0 * * @param string $object_type Type of object metadata is for. Accepts 'post', 'comment', 'term', 'user', * or any other object type with an associated meta table. * @param int $object_id ID of the object the metadata is for. * @param string $meta_key Optional. Registered metadata key. If not specified, retrieve all registered * metadata for the specified object. * @return mixed A single value or array of values for a key if specified. An array of all registered keys * and values for an object ID if not. False if a given $meta_key is not registered. */ function get_registered_metadata( $object_type, $object_id, $meta_key = '' ) { $object_subtype = get_object_subtype( $object_type, $object_id ); if ( ! empty( $meta_key ) ) { if ( ! empty( $object_subtype ) && ! registered_meta_key_exists( $object_type, $meta_key, $object_subtype ) ) { $object_subtype = ''; } if ( ! registered_meta_key_exists( $object_type, $meta_key, $object_subtype ) ) { return false; } $meta_keys = get_registered_meta_keys( $object_type, $object_subtype ); $meta_key_data = $meta_keys[ $meta_key ]; $data = get_metadata( $object_type, $object_id, $meta_key, $meta_key_data['single'] ); return $data; } $data = get_metadata( $object_type, $object_id ); if ( ! $data ) { return array(); } $meta_keys = get_registered_meta_keys( $object_type ); if ( ! empty( $object_subtype ) ) { $meta_keys = array_merge( $meta_keys, get_registered_meta_keys( $object_type, $object_subtype ) ); } return array_intersect_key( $data, $meta_keys ); } /** * Filters out `register_meta()` args based on a whitelist. * * `register_meta()` args may change over time, so requiring the whitelist * to be explicitly turned off is a warranty seal of sorts. * * @access private * @since 4.6.0 * * @param array $args Arguments from `register_meta()`. * @param array $default_args Default arguments for `register_meta()`. * @return array Filtered arguments. */ function _wp_register_meta_args_whitelist( $args, $default_args ) { return array_intersect_key( $args, $default_args ); } /** * Returns the object subtype for a given object ID of a specific type. * * @since 4.9.8 * * @param string $object_type Type of object metadata is for. Accepts 'post', 'comment', 'term', 'user', * or any other object type with an associated meta table. * @param int $object_id ID of the object to retrieve its subtype. * @return string The object subtype or an empty string if unspecified subtype. */ function get_object_subtype( $object_type, $object_id ) { $object_id = (int) $object_id; $object_subtype = ''; switch ( $object_type ) { case 'post': $post_type = get_post_type( $object_id ); if ( ! empty( $post_type ) ) { $object_subtype = $post_type; } break; case 'term': $term = get_term( $object_id ); if ( ! $term instanceof WP_Term ) { break; } $object_subtype = $term->taxonomy; break; case 'comment': $comment = get_comment( $object_id ); if ( ! $comment ) { break; } $object_subtype = 'comment'; break; case 'user': $user = get_user_by( 'id', $object_id ); if ( ! $user ) { break; } $object_subtype = 'user'; break; } /** * Filters the object subtype identifier for a non standard object type. * * The dynamic portion of the hook, `$object_type`, refers to the object * type (post, comment, term, or user). * * @since 4.9.8 * * @param string $object_subtype Empty string to override. * @param int $object_id ID of the object to get the subtype for. */ return apply_filters( "get_object_subtype_{$object_type}", $object_subtype, $object_id ); } Foges and Clara get married - In Sweden - Knight Photography Brisbane

Despite the fact that my wife Carla misses out on a date to the wedding, the opportunity to photograph your best friend’s wedding is pretty cool. Even cooler when it’s in Sweden.

The first time I met Foges, I knew straight away we were going to be friends. Our first interaction included him bailing on the ‘get to know you session’ on our first night at college.

 “…um, I think I am just going to cruise over to my friends house. I will catch up with you all later”. 

I just sat there wishing I could high tail it out of there with him away from the awkward chit chat. We have been good friends ever since, sharing a number of different households and becoming founding members of a large group of steadfast friends collectively known as ‘The Boys’ (and which now also includes a number of equally rad girls).

The Day before

The day before the wedding, the Knight tribe finally arrive in Sweden and Foges and his twin brother Gerry were there for the pick up. We had a few hours to check out locations for tomorrow’s before ceremony photo session and the happy couple had a number of ideas to suggest. I took off in the little VW excited about, not only seeing what they had to offer, but my first experience checking out Sweden.

First impressions were of amazement at the beauty of Sweden. Quaint little houses, large green fields and the beauty of Jonkopping’s amazing deep blue lake.

To be totally honest, I wasn’t too sure how Andy and Clara would go on camera. It can be challenging getting friends to relax when you work together. The main focus of my photography is intimacy and natural connection, and sometimes its easier to be your loved up self in front of a stranger. We got the lead out with a few shite jokes and posing 101 and I was very happy with the initial results.

It was a great afternoon catching up with them both and getting some time to talk through life in Sweden, hopes dreams for the future…and a very big (little) surprise.

Andy and Clara had organised a get together at a pub on the lake for the day before the wedding. Giving friends and family from Australia and Sweden a chance to meet/catch up. A great deal of friends from Australia had made the trip. Most had just finished a similar experience in London, where another one of The Boys tied the knot the week before.

It is hard to explain the friendship that ‘The Boys’ have developed since all attending the same university in Armidale. Initially we all bonded over skipping lectures and playing soccer. Our group has grown since our uni days, and for some these weddings were the first catch up in years. After 20 years, it is has got to the stage that we are family, warts and all…

The morning of the wedding had arrived and Andy was getting ready in his flat with some help from a few Swedish mates. He was in a good mood if not a little nervous about how the day would play out, especially with a storm on the way. We floated around the apartment for a bit, took a few awkward portraits and our lift arrived to pick us up.

Andy didn’t know it yet, but we had organized for a ‘first look’ moment down on a bridge in a quiet area of town. Andy and I had about 30 minute to wait for Clara to arrive and we talked about life, meaning and the usual banter. As Andy stood there ready to meet his soon to be wife, a beautiful lady in white made her way toward us. It was a wonderful thing to see Andy genuinely excited for what was to come. And all the joy of two people in love played out in front of me.

We headed off to the first location with the storm threatening. No one seemed nervous and we just took everything as it came. The view from the old castle was spectacular and Andy and Clara loosened up with a few forehead rolls and close cuddles. It is a bit of an effort to pose without really posing couples. They need to feel comfortable enough to think that they are the only ones there. To feel excited about being in each others arms, talking about the rest of their lives together. It wasn’t too hard with these two, they have a very close connection and you can tell that they are soul mates.

Back in the car and the rain begins. We are off to drop off their bags at a cute little cottage over looking a waterfall. As we arrive the rain is starting to belt down but without a thought we jumped out and I just start shooting. Then Andy spies an antique store and again without thinking we race in and again start shooting. It is poky, the lighting is all over the place and the owners look a little cranky…but somehow it just works. We just roll with it and they cuddle up next to the old cups, plates and quirky old mirrors.

Up until this point we didn’t really discuss where the ceremony would take place in the rain, but first thoughts were inside the reception venue. Andy’s Swedish stepped up and organised a white marque to be set up at the ceremony site. It seemed a shame that the beautiful view would be missed but in that little white tent with Andy and Clara’s family and loved ones it just worked. A beautiful short ceremony with every tucked in around the lovely couple.

Job done and onto the festivities. A little Swedish Fika and into the beautifully decorated hall.

Some lovely speeches were made, many kisses for the bride and groom when left alone at the table and a cure little song by Clara’s friends.

A wonderful night of booze, dancing and random chats ensued right up until 2am. Many sing-a-long ballads, many rad wine stained shirts and hugs and kisses all around. I never thought that I would ever spend 5 weeks in Europe with my young family, attending the weddings of two my best friends in the world. The whole experience has left me wanting more.

A wonderful reminder of the amazing experiences that life has to offer. Andy and Clara, you are two of the most important people in my life and I hope that the photos represent the connection and love that you have for each other. You mean so much to so many people. I can’t wait for our kids to grow up loving their Swedish cousins, and get the opportunity to play face to face wherever we may find each other in the world.

Leave a Reply