/** * @package ACF * @author WP Engine * * © 2025 Advanced Custom Fields (ACF®). All rights reserved. * "ACF" is a trademark of WP Engine. * Licensed under the GNU General Public License v2 or later. * https://www.gnu.org/licenses/gpl-2.0.html */ /** * Process updating bidirectional fields. * * @since 6.2 * * @param array $target_item_ids The post, user or term IDs which should be updated with the origin item ID. * @param integer|string $post_id The ACF encoded origin post, user or term ID. * @param array $field The field being updated on the origin post, user or term ID. * @param string|false $target_prefix The ACF prefix for a post, user or term ID required for the update_field call for this field type. */ function acf_update_bidirectional_values( $target_item_ids, $post_id, $field, $target_prefix = false ) { // Bail early if we're already updating a bidirectional relationship to prevent recursion. if ( acf_get_data( 'acf_doing_bidirectional_update' ) ) { return; } // Support disabling bidirectionality globally. if ( ! acf_get_setting( 'enable_bidirection' ) ) { return; } if ( empty( $field['bidirectional'] ) || empty( $field['bidirectional_target'] ) ) { return; } $decoded = acf_decode_post_id( $post_id ); $item_id = $decoded['id']; $valid_target_types = acf_get_valid_bidirectional_target_types( $decoded['type'] ); $valid_targets = array(); foreach ( $field['bidirectional_target'] as $target_field ) { $target_field_object = get_field_object( $target_field ); if ( empty( $target_field_object ) || ! is_array( $target_field_object ) ) { continue; } if ( in_array( $target_field_object['type'], $valid_target_types, true ) ) { $valid_targets[] = $target_field; } } if ( ! empty( $valid_targets ) ) { // Get current values for this field. $current_values = array_filter( acf_get_array( get_field( $field['key'], $post_id, false ) ) ); $new_values = array_filter( acf_get_array( $target_item_ids ) ); $additions = array_diff( $new_values, $current_values ); $subtractions = array_diff( $current_values, $new_values ); // Prefix additions and subtractions for destinations which aren't posts. if ( ! empty( $target_prefix ) ) { $mapper = function ( $v ) use ( $target_prefix ) { return $target_prefix . '_' . $v; }; $additions = array_map( $mapper, $additions ); $subtractions = array_map( $mapper, $subtractions ); } acf_set_data( 'acf_doing_bidirectional_update', true ); // Loop over each target, processing additions and removals. foreach ( $valid_targets as $target_field ) { foreach ( $additions as $addition ) { $current_value = acf_get_array( get_field( $target_field, $addition, false ) ); update_field( $target_field, array_unique( array_merge( $current_value, array( $item_id ) ) ), $addition ); } foreach ( $subtractions as $subtraction ) { $current_value = acf_get_array( get_field( $target_field, $subtraction, false ) ); update_field( $target_field, array_unique( array_diff( $current_value, array( $item_id ) ) ), $subtraction ); } } acf_set_data( 'acf_doing_bidirectional_update', false ); } } /** * Allows third party fields to enable support as a target field type for a particular object type * * @since 6.2 * * @param string $object_type The object type that will be updated on the target field, such as 'term', 'user' or 'post'. * * @return array An array of valid field type names (slugs) for the target of the bidirectional field. */ function acf_get_valid_bidirectional_target_types( $object_type ) { $valid_target_types = array(); switch ( $object_type ) { case 'term': $valid_target_types = array( 'taxonomy' ); break; case 'user': $valid_target_types = array( 'user' ); break; case 'post': $valid_target_types = array( 'relationship', 'post_object' ); break; } return apply_filters( 'acf/bidirectional/supported_field_types_for_post', $valid_target_types, $object_type ); } /** * Build the complete choices argument for rendering the select2 field for bidirectional target based on the currently selected choices * * @since 6.2 * * @param array $choices The currently selected choices (as an array of field keys). * * @return array */ function acf_build_bidirectional_target_current_choices( $choices ) { if ( empty( $choices ) ) { return array(); } $results = array(); foreach ( $choices as $choice ) { if ( empty( $choice ) || ! is_string( $choice ) ) { continue; } $field_object = get_field_object( $choice ); if ( is_array( $field_object ) && ! empty( $field_object['label'] ) ) { $results[ $choice ] = $field_object['label']; } else { $results[ $choice ] = $choice; } } return $results; } /** * Build valid fields for a bidirectional relationship for select2 display * * @since 6.2 * * @param array $results The original results array. * @param array $options The options provided to the select2 AJAX search. * * @return array */ function acf_build_bidirectional_relationship_field_target_args( $results, $options ) { $valid_field_types = apply_filters( 'acf/bidirectional/supported_target_field_types', array( 'relationship', 'post_object', 'user', 'taxonomy' ) ); $field_groups = array_filter( acf_get_field_groups(), function ( $field_group ) { return $field_group['active']; } ); $valid_fields = array(); foreach ( $field_groups as $field_group ) { $fields = acf_get_fields( $field_group ); foreach ( $fields as $field ) { if ( in_array( $field['type'], $valid_field_types, true ) ) { if ( empty( $valid_fields[ $field_group['title'] ] ) ) { $valid_fields[ $field_group['title'] ] = array(); } $valid_fields[ $field_group['title'] ][ $field['key'] ] = array( 'type' => $field['type'], 'label' => $field['label'], ); if ( isset( $options['parent_key'] ) && $options['parent_key'] === $field['key'] ) { $valid_fields[ $field_group['title'] ][ $field['key'] ]['this_field'] = true; } } } } foreach ( $valid_fields as $field_group_name => $fields ) { $field_group = array( 'text' => $field_group_name, 'children' => array(), ); foreach ( $fields as $key => $data ) { $field_group['children'][] = array( 'id' => $key, 'text' => $data['label'], 'field_type' => $data['type'], /* translators: %s A field type name, such as "Relationship" */ 'human_field_type' => sprintf( __( '%s Field', 'acf' ), acf_get_field_type_prop( $data['type'], 'label' ) ), 'this_field' => ! empty( $data['this_field'] ), ); } $results['results'][] = $field_group; } return $results; } add_action( 'acf/fields/select/query/key=_acf_bidirectional_target', 'acf_build_bidirectional_relationship_field_target_args', 10, 2 ); /** * Renders the field settings required for bidirectional fields * * @since 6.2 * * @param array $field The field object passed into field setting functions. */ function acf_render_bidirectional_field_settings( $field ) { if ( ! acf_get_setting( 'enable_bidirection' ) ) { return; } acf_render_field_setting( $field, array( 'label' => __( 'Bidirectional', 'acf' ), 'instructions' => __( 'Update a field on the selected values, referencing back to this ID', 'acf' ), 'type' => 'true_false', 'name' => 'bidirectional', 'ui' => 1, ) ); acf_render_field_setting( $field, array( 'name' => 'bidirectional_notes', 'type' => 'message', 'message' => acf_get_bidirectional_field_settings_instruction_text(), 'conditions' => array( 'field' => 'bidirectional', 'operator' => '==', 'value' => 1, ), ) ); acf_render_field_setting( $field, array( 'type' => 'select', 'name' => 'bidirectional_target', 'label' => __( 'Target Field', 'acf' ), 'instructions' => __( 'Select field(s) to store the reference back to the item being updated. You may select this field. Target fields must be compatible with where this field is being displayed. For example, if this field is displayed on a Taxonomy, your target field should be of type Taxonomy', 'acf' ), 'class' => 'bidrectional_target', 'choices' => acf_build_bidirectional_target_current_choices( $field['bidirectional_target'] ), 'conditions' => array( 'field' => 'bidirectional', 'operator' => '==', 'value' => 1, ), 'ui' => 1, 'multiple' => 1, 'ajax' => 1, ) ); } /** * Returns the translated instructional text for the message field for the bidirectional field settings. * * @since 6.2 * * @return string The html containing the instructional message. */ function acf_get_bidirectional_field_settings_instruction_text() { /* translators: %s the URL to ACF's bidirectional relationship documentation */ $message = '

' . sprintf( __( 'Enabling the bidirectional setting allows you to update a value in the target fields for each value selected for this field, adding or removing the Post ID, Taxonomy ID or User ID of the item being updated. For more information, please read the documentation.', 'acf' ), acf_add_url_utm_tags( 'https://www.advancedcustomfields.com/resources/bidirectional-relationships/', 'docs', 'bidirectional' ) ) . '

'; return $message; } Penguin LIVE ACT Vinny Grosso – Erdnase Magic Store https://erdnasemagicstore.io Almost free :) Thu, 19 May 2022 08:52:56 +0000 en-US hourly 1 https://erdnasemagicstore.io/wp-content/uploads/2023/11/sparkle_logo.svg Penguin LIVE ACT Vinny Grosso – Erdnase Magic Store https://erdnasemagicstore.io 32 32 Vinny Grosso – Penguin LIVE ACT (July 14th, 2019) https://erdnasemagicstore.io/product/vinny-grosso-penguin-live-act-july-14th-2019/?utm_source=rss&utm_medium=rss&utm_campaign=vinny-grosso-penguin-live-act-july-14th-2019 Sun, 14 Jul 2019 00:00:00 +0000 http://176.123.9.228/product/vinny-grosso-penguin-live-act-july-14th-2019/ SUPPORT LIVE MAGIC. START LEARNING THE FULL ACT TODAY.]]>

 

“Vinny Grosso is a true gentleman, one of the most gracious guys in magic. That said, he also fooled us badly and made us love it.” – Teller

“Not only did he fool Penn & Teller, he also fooled me. Which I believe to be way harder.” – Mac King

“Vinny Grosso is one of my favorite magicians. Anytime he talks, I listen, and so do lots of other magicians in the know. Don’t be fooled by his nice guy image, it’s real. And like most top magicians, he realizes that sometimes the best material lies in uncovering a classic and making it new again. Vinny also knows that the real secret to success is in how an entertainer treats an audience and being likable, and he’s a master at both.” – Michael Mode

“Vinny Grosso is one of those rare magicians. He has experience in almost all areas of magic, from behind the scenes to theater booking other acts and creating rare, unusual, off-the-wall yet highly entertaining performance pieces. Vinny is hands-on funny, and amazing. You need to see, to learn, and to experience Vinny Grosso. You will walk away with your life changed. Oh, and if that was not enough, he is kind of okay as a human being as well.” – Banachek

What will he teach?

Stage/parlor Act:

Marked Cards – a comedy presentation recounting Vinny’s Tasteless routine where he fooled Penn & Teller by tasting a card…naked

Tossed out Words – an adaptation of the tossed out deck using words

Medium Exposure – a version of mental epic that does not require anything to be forced at the end

Name a Card – simplified version of a name appearing on a spectator’s thought of card. (lecture includes versions for corporate work)

Hostage – an updated In/Out rope routine with handcuff ending

Also Discussing:

Both of his “Fool Us” acts explained, their genesis and behind the scenes stories from “Fool Us”

Mentalist vs Magician – thoughts, tips and ideas for magicians performing mentalism routines within a magic act

Business Card Mentalism – adaptation of mental epic and psychometry for business cards

Who is he?

People most recognize Vinny Grosso as the guy who got naked and fooled Penn & Teller. He also fooled them again with his clothes on, was a featured act on season 12 of America’s Got Talent, a Past National President of The Society of American Magicians, a Member of the Inner Magic Circle with Gold Star, world record holder for jumping on broken glass (RHR) and former tour manager and technical director for artists like Cesar Millan (the dog whisperer), Colin Mochrie & Brad Sherwood (whose line), Ina Garten (the barefoot contessa) & Mel Brooks.

]]>