Attachment — Прикрепить к КАТЕГОРИИ а не к записи

Можно ли расширить функционал ?

Хочу закреплять картинку к категории или термину.

0
kolshix
19 дней назад 784
  • 0
    Kama 9824

    Нарывался на эту проблему как-то. Нет хука номрально в ВП. Хотел даже в ядро написать, надо бы...

    А пока вот такой класс нашел у себя. Он позволяет через хук менять значение этой колонки.

    <?php
    /**
     * Class to extend the "Uploaded to" column in the media library.
     * Adds the ability to modify the column value.
     *
     * Usage:
     *
     * 1) Initialize the class:
     * ```
     * Media_Uploaded_To_Column_Extend::init();
     * ```
     *
     * 2) Use the filter:
     * ```
     * add_filter( 'media_parent_more_column_value', 'my_change_media_uploaded_to_column_value', 10, 2 );
     * function my_change_media_uploaded_to_column_value( $column_vals, $post ){
     *     // $column_vals - array of values for the "Uploaded to" column
     *     return $column_vals;
     * }
     * ```
     */
    class Media_Uploaded_To_Column_Extend {
    
    	public static function init(): void {
    		add_filter( 'manage_upload_sortable_columns', [ __CLASS__, 'replace_media_parent_sortable_column' ] );
    		add_filter( 'manage_media_columns',           [ __CLASS__, 'replace_media_parent_column' ] );
    		add_action( 'manage_media_custom_column',     [ __CLASS__, 'change_media_parent_column_val' ], 10, 2 );
    	}
    
    	public static function replace_media_parent_sortable_column( array $columns ): array {
    		$columns['parent_more'] = [ 'parent' ];
    		unset( $columns['parent'] );
    
    		return $columns;
    	}
    
    	public static function replace_media_parent_column( array $columns ): array {
    		$new = [
    			'parent_more' => _x( 'Uploaded to', 'column name', 'default' ),
    		];
    		$position = array_search( 'parent', array_keys( $columns ), true ) + 1; // !before unset
    		unset( $columns['parent'] );
    
    		return array_slice( $columns, 0, $position ) + $new + $columns;
    	}
    
    	/**
    	 * Fills/complete the content of the "Uploaded to" (parent) column.
    	 *
    	 * @param string $colname
    	 * @param int    $post_id
    	 */
    	public static function change_media_parent_column_val( $colname, $post_id ): void {
    
    		if( 'parent_more' === $colname ){
    			global $wp_list_table;
    
    			$post = get_post( $post_id );
    
    			ob_start();
    			$wp_list_table->column_parent( $post );
    			$_val = ob_get_clean();
    
    			// see https://wp-kama.ru/function/WP_Media_List_Table::column_parent
    			$column_vals = preg_split( '~<br[^>]*>~', $_val );
    
    			/**
    			 * Allows to change the "parent" column value for the media library.
    			 *
    			 * @param array   $column_vals
    			 * @param WP_Post $post
    			 */
    			$column_vals = (array) apply_filters( 'media_parent_more_column_value', $column_vals, $post );
    
    			echo implode( '<br />', $column_vals );
    		}
    
    	}
    
    }
    
    Пример использвоания

    Инитишь класс:

    Media_Uploaded_To_Column_Extend::init();

    Юзаешь хук. Пример из кода моего, там я хук несколько мест, но тут картинка для термина как раз, просто отображается что к термину прикреплена...

    // меняем значение колоки - картинка для термина
    add_action( 'media_parent_more_column_value', media_uploaded_to__term_image_val(...), 10, 2 );
    function media_uploaded_to__term_image_val( $column_vals, $attach ) {
    	if( ! class_exists( WP_Term_Image::class ) ){
    		return $column_vals;
    	}
    
    	$out = [];
    	$term_ids = WP_Term_Image::get_attach_term_ids( $attach->ID );
    
    	foreach( $term_ids as $term_id ){
    		$out[] = sprintf( 'Term: <a href="%s" target="_blank">%s</a>', get_edit_term_link( $term_id ), esc_html( get_term( $term_id )->name ) );
    	}
    
    	return $out ? implode( '<br>', $out ) : $column_vals;
    }
    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация