MB Admin Columns with MB Relationships
Support › MB Admin Columns › MB Admin Columns with MB Relationships
- This topic has 4 replies, 2 voices, and was last updated 7 years ago by
cedriccouret.
-
AuthorPosts
-
March 31, 2018 at 8:46 PM #9021
cedriccouret
ParticipantHi,
I'm trying to display a relationship in a custom column and I also need it filterable.
I managed to display the column with this code:add_action( 'manage_assembly_step_posts_custom_column' , 'custom_assembly_step_column', 10, 2 ); function custom_assembly_step_column( $column, $post_id ) { switch ( $column ) { case 'bunkie' : $bunkies = new WP_Query( array( 'relationship' => array( 'id' => 'bunkies_to_assembly_steps', 'to' => $post_id ), 'nopaging' => true, ) ); if ($bunkies->have_posts()) { foreach ($bunkies->posts as $index => $bunkie) { $bunkieMetas = get_post_meta($bunkie->ID); echo $bunkieMetas['name_en'][0]; if ($index !== count($bunkies->posts) - 1) { echo '<br>'; } } } break; } }
I'm using this code to display a dropdown with all options:
add_action( 'restrict_manage_posts', 'filter_assembly_steps_by_bunkie' ); function filter_assembly_steps_by_bunkie() { global $typenow; global $wpdb; if ( $typenow == 'assembly_step' ) { $bunkies = $wpdb->get_results( "SELECT * FROM $wpdb->posts WHERE post_type = 'bunkie' AND post_status = 'publish'" ); $values = []; foreach ($bunkies as $bunkie) { $values[$bunkie->post_title] = $bunkie->ID; } $current_bunkie = ''; if( isset( $_GET['bunkie_id'] ) ) { $current_bunkie = $_GET['bunkie_id']; } ?> <select name="bunkie_id" id="bunkie_id"> <option value="all" <?php selected( 'all', $current_bunkie ); ?>><?php _e( 'Filter By Bunkies', 'text_domain' ); ?></option> <?php foreach( $bunkies as $bunkie ) { ?> <option value="<?php echo esc_attr( $bunkie->ID ); ?>" <?php selected( $bunkie->ID, $current_bunkie ); ?>><?php echo esc_attr( $bunkie->post_title ); ?></option> <?php } ?> </select> <?php } }
But then I don't how to make it sortable. I was using this code before because I used to set a custom field instead of using your relationships plugin:
add_filter( 'parse_query', 'query_filter_assembly_steps_by_bunkie' ); function query_filter_assembly_steps_by_bunkie( $query ) { global $pagenow; // Get the post type $post_type = isset( $_GET['post_type'] ) ? $_GET['post_type'] : ''; if ( is_admin() && $pagenow === 'edit.php' && $post_type === 'assembly_step' && isset( $_GET['bunkie_id'] ) && $_GET['bunkie_id'] !== 'all' ) { $query->query_vars['meta_key'] = 'bunkies'; $query->query_vars['meta_value'] = $_GET['bunkie_id']; $query->query_vars['meta_compare'] = '='; } }
I would really appreciate it if someone could show me how to make this work.
Thanks !April 2, 2018 at 4:33 PM #9030Anh Tran
KeymasterHello,
The last snippet seems to make the dropdown works, e.g. making the column *filterable*, instead of *sortable*, doesn't it?
If so, can you try this:
add_filter( 'parse_query', 'query_filter_assembly_steps_by_bunkie' ); function query_filter_assembly_steps_by_bunkie( $query ) { global $pagenow; $post_type = isset( $_GET['post_type'] ) ? $_GET['post_type'] : ''; if ( is_admin() && $pagenow === 'edit.php' && $post_type === 'assembly_step' && isset( $_GET['bunkie_id'] ) && $_GET['bunkie_id'] !== 'all' ) { $query->set( 'p', intval( $_GET['bunkie_id'] ) ); } }
This code filters the list and displays only 1 post (the post that is selected).
If you want to filter the list and display all posts that have connected "from" a bunkie, then you might want to use this:
add_filter( 'parse_query', 'query_filter_assembly_steps_by_bunkie' ); function query_filter_assembly_steps_by_bunkie( $query ) { global $pagenow, $wpdb; $post_type = isset( $_GET['post_type'] ) ? $_GET['post_type'] : ''; if ( is_admin() && $pagenow === 'edit.php' && $post_type === 'assembly_step' && isset( $_GET['bunkie_id'] ) && $_GET['bunkie_id'] !== 'all' ) { $bunkie_id = $_GET['bunkie_id']; $post_ids = $wpdb->get_col( $wpdb->prepare( "SELECT <code>to</code> FROM $wpdb->mb_relationships WHERE <code>from</code> = %d", $bunkie_id ) ); $query->set( 'post__in', $post_ids ); } }
April 2, 2018 at 5:30 PM #9033cedriccouret
ParticipantHi,
thanks for your feedback. I've used this modified version of your second snippet and was able to filter my assembly steps by bunkie.
$post_ids = $wpdb->get_col( $wpdb->prepare( "SELECT to FROM $wpdb->mb_relationships WHERE from = %d AND type = 'bunkies_to_assembly_steps'", $bunkie_id ) );
But I'm facing inconsistency in the columns displayed, I'll try to explain myself.
These are the columns I have when I list my assembly steps:
Title - Bunkie (which is empty)Now when I select a bunkie name from the dropdown and apply the filter:
Title - Image (custom field created in metabox and displayed via 'admin_columns' => true)
Note that the "Bunkie" column disappeared.When I use the "search" field and type a bunkie's name, it shows me the associated assembly steps with the following columns:
Title - Bunkie (with proper content)
Note that the "image" column is absent.I could show you screenshots but don't know how to attach them here.
Thanks for your help.
April 3, 2018 at 6:15 PM #9040Anh Tran
KeymasterHi, I'm not really clear about the situation. Can you please take a screenshot, upload it on imgur.com and paste the link here?
April 24, 2018 at 5:02 AM #9333cedriccouret
ParticipantSorry for this long delay,
I finally ended up not using this so the problem vanished 🙂Thanks for your support.
-
AuthorPosts
- The topic ‘MB Admin Columns with MB Relationships’ is closed to new replies.