Skip to content

Instantly share code, notes, and snippets.

@Crocoblock
Created March 27, 2023 18:55
Show Gist options
  • Save Crocoblock/6645115b812a58fc850eaa883e0505f2 to your computer and use it in GitHub Desktop.
Save Crocoblock/6645115b812a58fc850eaa883e0505f2 to your computer and use it in GitHub Desktop.
JetEngine Related Items by Sibling Relation Macro
<?php
add_action( 'jet-engine/register-macros', function(){
class Related_Items_By_Sibling_Relation extends \Jet_Engine_Base_Macros {
public function macros_tag() {
return 'rel_get_items_by_relation';
}
public function macros_name() {
return __( 'Related Items By Sibling Relation', 'jet-engine' );
}
public function macros_callback( $args = array() ) {
$rel_id = isset( $args['_rel_id'] ) ? $args['_rel_id'] : false;
$rel_object = isset( $args['_rel_object'] ) ? $args['_rel_object'] : 'child_object';
$rel_object_from = isset( $args['_rel_object_from'] ) ? $args['_rel_object_from'] : 'current_object';
$rel_object_var = isset( $args['_rel_object_var'] ) ? $args['_rel_object_var'] : '';
$rel_id2 = isset( $args['_rel_id2'] ) ? $args['_rel_id2'] : false;
$rel_object2 = isset( $args['_rel_object2'] ) ? $args['_rel_object2'] : 'child_object';
$empty = PHP_INT_MAX;
if ( ! (int) $rel_id || ! (int) $rel_id2 ) {
return $empty;
}
$relation = jet_engine()->relations->get_active_relations( $rel_id );
if ( ! $relation ) {
return $empty;
}
$object_id = false;
if ( $rel_object_from ) {
$object_id = jet_engine()->relations->sources->get_id_by_source( $rel_object_from, $rel_object_var );
if ( ! $object_id ) {
return $empty;
}
}
$related_ids = array();
switch ( $rel_object ) {
case 'parent_object':
$related_ids = $relation->get_parents( $object_id, 'ids' );
break;
default:
$related_ids = $relation->get_children( $object_id, 'ids' );
break;
}
$related_ids = ! empty( $related_ids ) ? $related_ids : array( $empty );
$related = array();
$relation = jet_engine()->relations->get_active_relations( $rel_id2 );
switch ( $rel_object2 ) {
case 'parent_object':
foreach ( $related_ids as $object_id ) {
$related = array_merge( $relation->get_parents( $object_id, 'ids' ), $related );
}
break;
default:
foreach ($related_ids as $object_id) {
$related = array_merge( $relation->get_children( $object_id, 'ids' ), $related );
}
break;
}
$related = array_unique( $related );
if ( empty( $related ) ) {
return $empty;
}
return implode( ',', $related );
}
public function macros_args() {
return array(
'_rel_id' => array(
'label' => __( 'By Direct Relation', 'jet-engine' ),
'type' => 'select',
'options' => function() {
return jet_engine()->relations->get_relations_for_js( true, __( 'Select...', 'jet-engine' ) );
},
'default' => '',
),
'_rel_object' => array(
'label' => __( 'By Direct Object', 'jet-engine' ),
'type' => 'select',
'options' => array(
'parent_object' => __( 'Parent Object', 'jet-engine' ),
'child_object' => __( 'Child Object', 'jet-engine' ),
),
'default' => 'child_object',
),
'_rel_id2' => array(
'label' => __( 'From Sibling Relation', 'jet-engine' ),
'type' => 'select',
'options' => function() {
return jet_engine()->relations->get_relations_for_js( true, __( 'Select...', 'jet-engine' ) );
},
'default' => '',
),
'_rel_object2' => array(
'label' => __( 'From Sibling Object', 'jet-engine' ),
'type' => 'select',
'options' => array(
'parent_object' => __( 'Parent Object', 'jet-engine' ),
'child_object' => __( 'Child Object', 'jet-engine' ),
),
'default' => 'child_object',
),
'_rel_object_from' => array(
'label' => __( 'Direct Object ID From', 'jet-engine' ),
'type' => 'select',
'options' => array( jet_engine()->relations->sources, 'get_sources' ),
'default' => 'current_object',
),
'_rel_object_var' => array(
'label' => __( 'Variable Name', 'jet-engine' ),
'type' => 'text',
'default' => '',
'condition' => array( 'rel_object_from' => array( 'query_var', 'object_var' ) ),
),
);
}
}
new Related_Items_By_Sibling_Relation();
} );
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment