error or status message(s), 'body' => '', * 'prevent_default' => true to bypass the MLA handler ) */ public static function mla_list_table_inline_action( $item_content, $post_id ) { /* * Convert the comma-delimited string of "checked" checkbox values back to * an ACF-compatible array */ if ( isset( $_REQUEST['custom_updates'] ) && isset( $_REQUEST['custom_updates'][ self::ACF_CHECKBOX_FIELD ] ) ) { if ( ! empty( $_REQUEST['custom_updates'][ self::ACF_CHECKBOX_FIELD ] ) ) { $_REQUEST['custom_updates'][ self::ACF_CHECKBOX_FIELD ] = explode( ',', $_REQUEST['custom_updates'][ self::ACF_CHECKBOX_FIELD ] ); } } return $item_content; } // mla_list_table_inline_action /** * Pre-filter MLA_List_Table bulk action request parameters * * This filter gives you an opportunity to pre-process the request parameters for a bulk action * before the action begins. DO NOT assume parameters come from the $_REQUEST super array! * * @since 1.01 * * @param array $request bulk action request parameters, including ['mla_bulk_action_do_cleanup']. * @param string $bulk_action the requested action. * @param array $custom_field_map [ slug => field_name ] * * @return array updated bulk action request parameters */ public static function mla_list_table_bulk_action_initial_request( $request, $bulk_action, $custom_field_map ) { /* * If the field is present, save the field value for our own update process and remove it * from the $request array to prevent MLA's default update processing. */ if ( false !== $slug = array_search( self::ACF_CHECKBOX_FIELD, $custom_field_map ) ) { if ( ! empty( $request[ $slug ] ) ) { self::$acf_checkbox_value = trim( $request[ $slug ] ); $request[ $slug ] = ''; } } return $request; } // mla_list_table_bulk_action_initial_request /** * Holds the new ACF checkbox value for the duration of a Bulk Edit action * * @since 1.01 * * @var string */ private static $acf_checkbox_value = NULL; /** * Process an MLA_List_Table bulk action * * This filter gives you an opportunity to pre-process an MLA_List_Table page-level * or single-item action, standard or custom, before the MLA handler. * The filter is called once for each of the items in $_REQUEST['cb_attachment']. * * @since 1.00 * * @param array $item_content NULL, to indicate no handler. * @param string $bulk_action the requested action. * @param integer $post_id the affected attachment. * * @return object updated $item_content. NULL if no handler, otherwise * ( 'message' => error or status message(s), 'body' => '', * 'prevent_default' => true to bypass the MLA handler ) */ public static function mla_list_table_bulk_action( $item_content, $bulk_action, $post_id ) { /* * If the field is present, apply our own update process. Note the * special 'empty' value to bulk-delete the custom field entirely. */ if ( ! empty( self::$acf_checkbox_value ) ) { if ( 'empty' == self::$acf_checkbox_value ) { delete_post_meta( $post_id, self::ACF_CHECKBOX_FIELD ); $item_content = array( 'message' => sprintf( __( 'Deleting %1$s', 'media-library-assistant' ) . '
', self::ACF_CHECKBOX_FIELD ) ); } else { update_post_meta( $post_id, self::ACF_CHECKBOX_FIELD, explode( ',', self::$acf_checkbox_value ) ); $item_content = array( 'message' => sprintf( __( 'Adding %1$s = %2$s', 'media-library-assistant' ) . '
', self::ACF_CHECKBOX_FIELD, self::$acf_checkbox_value ) ); } } return $item_content; } // mla_list_table_bulk_action /** * MLA_List_Table inline edit item values * * This filter gives you a chance to modify and extend the substitution values * for the Quick and Bulk Edit forms. * * @since 1.00 * * @param array $item_values parameter_name => parameter_value pairs * * @return array updated substitution parameter name => value pairs */ public static function mla_list_table_inline_values( $item_values ) { /* * Replace the ACF Field Name with a more friendly Field Label */ $item_values['custom_fields'] = str_replace( '>acf_checkbox<', '>' . self::ACF_CHECKBOX_TITLE . '<', $item_values['custom_fields'] ); $item_values['bulk_custom_fields'] = str_replace( '>acf_checkbox<', '>' . self::ACF_CHECKBOX_TITLE . '<', $item_values['bulk_custom_fields'] ); return $item_values; } // mla_list_table_inline_values /** * Holds the ISC custom field name to column "slug" mapping values * * @since 1.01 * * @var array */ private static $field_slugs = array(); /** * Filter the MLA_List_Table columns * * This MLA-specific filter gives you an opportunity to filter the list table columns. * * @since 1.00 * * @param array $columns An array of columns. * format: column_slug => Column Label * * @return array updated array of columns. */ public static function mla_list_table_get_columns( $columns ) { /* * The Quick and Bulk Edit forms substitute arbitrary "slugs" for the * custom field names. Remember them for table column and bulk update processing. */ if ( false !== $slug = array_search( self::ACF_CHECKBOX_FIELD, $columns ) ) { self::$field_slugs[ self::ACF_CHECKBOX_FIELD ] = $slug; /* * Change the column slug so we can provide our own friendly content. * Replace the entry for the column we're capturing, preserving its place in the list */ $new_columns = array(); foreach ( $columns as $key => $value ) { if ( $key == $slug ) { $new_columns[ self::ACF_CHECKBOX_FIELD ] = self::ACF_CHECKBOX_TITLE; } else { $new_columns[ $key ] = $value; } } // foreach column $columns = $new_columns; } /* * Add a column of our own for the repeater "where-used" information */ $columns[ 'acf_' . self::ACF_REPEATER_FIELD ] = self::ACF_REPEATER_TITLE; return $columns; } // mla_list_table_get_columns /** * Filter the MLA_List_Table hidden columns * * This MLA-specific filter gives you an opportunity to filter the hidden list table columns. * * @since 1.00 * * @param array $hidden_columns An array of columns. * format: index => column_slug * * @return array updated array of columns. */ public static function mla_list_table_get_hidden_columns( $hidden_columns ) { /* * Replace the MLA custom field slug with our own slug value */ if ( isset( self::$field_slugs[ self::ACF_CHECKBOX_FIELD ] ) ) { $index = array_search( self::$field_slugs[ self::ACF_CHECKBOX_FIELD ], $hidden_columns ); if ( false !== $index ) { $hidden_columns[ $index ] = self::ACF_CHECKBOX_FIELD; } } return $hidden_columns; } // mla_list_table_get_hidden_columns /** * Filter the MLA_List_Table sortable columns * * This MLA-specific filter gives you an opportunity to filter the sortable list table * columns; a good alternative to the 'manage_media_page_mla_menu_sortable_columns' filter. * * @since 1.00 * * @param array $sortable_columns An array of columns. * Format: 'column_slug' => 'orderby' * or 'column_slug' => array( 'orderby', true ) * * The second format will make the initial sorting order be descending. * * @return array updated array of columns. */ public static function mla_list_table_get_sortable_columns( $sortable_columns ) { /* * Replace the slug for the column we've captured, preserving its place in the list */ if ( isset( self::$field_slugs[ self::ACF_CHECKBOX_FIELD ] ) ) { $slug = self::$field_slugs[ self::ACF_CHECKBOX_FIELD ]; if ( isset( $sortable_columns[ $slug ] ) ) { $new_columns = array(); foreach ( $sortable_columns as $key => $value ) { if ( $key == $slug ) { $new_columns[ self::ACF_CHECKBOX_FIELD ] = $value; } else { $new_columns[ $key ] = $value; } } // foreach column $sortable_columns = $new_columns; } // slug found } // slug exists return $sortable_columns; } // mla_list_table_get_sortable_columns /** * Translate post_status 'future', 'pending', 'draft' and 'trash' to label * * @since 1.02 * * @param string post_status * * @return string Status label or empty string */ protected static function _format_post_status( $post_status ) { $flag = ',
'; switch ( $post_status ) { case 'draft' : $flag .= __('Draft'); break; case 'future' : $flag .= __('Scheduled'); break; case 'pending' : $flag .= _x('Pending', 'post state'); break; case 'trash' : $flag .= __('Trash'); break; default: $flag = ''; } return $flag; } /** * Supply a column value if no column-specific function has been defined * * Called when the MLA_List_Table can't find a value for a given column. * * @since 1.00 * * @param string NULL, indicating no default content * @param array A singular item (one full row's worth of data) * @param array The name/slug of the column to be processed * @return string Text or HTML to be placed inside the column */ public static function mla_list_table_column_default( $content, $item, $column_name ) { /* * Convert the ACF-compatible array to a comma-delimited list of * "checked" checkbox values. */ if ( self::ACF_CHECKBOX_FIELD == $column_name ) { $values = isset( $item->mla_item_acf_checkbox ) ? $item->mla_item_acf_checkbox : ''; if ( empty( $values ) ) { return ''; } elseif ( is_array( $values ) ) { return '[' . implode( '],[', $values ) . ']'; } else { return $values; } } /* * Retrieve and format the repeater field "where-used" information */ if ( ( 'acf_' . self::ACF_REPEATER_FIELD ) == $column_name ) { global $wpdb; $where_clause = self::ACF_REPEATER_FIELD . '_%_' . self::ACF_SUB_FIELD; $references = $wpdb->get_results( " SELECT * FROM {$wpdb->postmeta} WHERE meta_key LIKE '{$where_clause}' AND meta_value = {$item->ID} " ); $content = ''; if ( ! empty( $references ) ) { $parents = array(); foreach ( $references as $reference ) { // key on post_id to remove duplicates $parents[ $reference->post_id ] = $reference->post_id; } $parents = implode( ',', $parents ); $references = $wpdb->get_results( " SELECT ID, post_type, post_status, post_title FROM {$wpdb->posts} WHERE ( post_type <> 'revision' ) AND ( ID IN ({$parents}) ) " ); foreach ( $references as $reference ) { $status = self::_format_post_status( $reference->post_status ); if ( $reference->ID == $item->post_parent ) { $parent = ',
' . __( 'PARENT', 'media-library-assistant' ); } else { $parent = ''; } $content .= sprintf( '%2$s (%3$s %4$s%5$s%6$s), ', /*%1$s*/ esc_url( add_query_arg( array('post' => $reference->ID, 'action' => 'edit'), 'post.php' ) ), /*%2$s*/ esc_attr( $reference->post_title ), /*%3$s*/ esc_attr( $reference->post_type ), /*%4$s*/ $reference->ID, /*%5$s*/ $status, /*%6$s*/ $parent ) . "
\r\n"; } // foreach $reference } // found $references } // found repeater column return $content; } // mla_list_table_column_default /** * Filter the data for inline (Quick and Bulk) editing * * This filter gives you an opportunity to filter the data passed to the * JavaScript functions for Quick and Bulk editing. * * @since 1.00 * * @param string $inline_data The HTML markup for inline data. * @param object $item The current Media Library item. * * @return string updated HTML markup for inline data. */ public static function mla_list_table_build_inline_data( $inline_data, $item ) { /* * See if the field is present */ if ( ! isset( self::$field_slugs[ self::ACF_CHECKBOX_FIELD ] ) ) { return $inline_data; } /* * Convert the ACF-compatible array to a comma-delimited list of * "checked" checkbox values. */ $match_count = preg_match_all( '/\
(.*)\<\/div\>/', $inline_data, $matches, PREG_OFFSET_CAPTURE ); if ( ( $match_count == false ) || ( $match_count == 0 ) ) { return $inline_data; } if ( isset( $item->mla_item_acf_checkbox ) ) { $value = $item->mla_item_acf_checkbox; if ( is_array( $value ) ) { $head = substr( $inline_data, 0, $matches[1][0][1] ); $value = esc_html( implode( ',', $value ) ); $tail = substr( $inline_data, ( $matches[1][0][1] + strlen( $matches[1][0][0] ) ) ); $inline_data = $head . $value . $tail; } } return $inline_data; } // mla_list_table_build_inline_data } // Class MLAACFExample /* * Install the filters at an early opportunity */ add_action('init', 'MLAACFExample::initialize'); ?>