it-swarm.com.de

Filtern nach Beitragskategorie in der Mediathek

Ich versuche, eine Möglichkeit zu finden, die Medienbibliothek nach der Post-Kategorie zu filtern, der ein Medienelement zugewiesen ist. Ich kann sehen, dass Sie nach "angeheftet" sortieren können, aber das bringt mich nur ein bisschen dahin. Irgendwelche Vorschläge?

6
whodeee

Sie können pre_get_posts verwenden, um die Abfrage zu filtern.

Also kannst du

  1. abrufen einer Kategorie aus Abfragevariablen
  2. die den Beitrag mit dieser Kategorie abrufen
  3. stellen Sie die Medienabfrage so ein, dass sie nur Posts enthält, die diese Posts als übergeordnete Posts haben

Um eine Benutzeroberfläche zu erstellen, können Sie restrict_manage_posts hook verwenden, um ein Kategorie-Dropdown auszugeben.

add_action('pre_get_posts', 'my_filter_media_by_cat');
add_action( 'restrict_manage_posts', 'my_add_media_cat_dropdown' );

function my_filter_media_by_cat( $q ) {
  $scr = get_current_screen();
  $cat = filter_input(INPUT_GET, 'postcat', FILTER_SANITIZE_STRING );   
  if ( ! $q->is_main_query() || ! is_admin() || (int)$cat <= 0 || $scr->base !== 'upload' )
      return;
  // get the posts
  $posts = get_posts( 'nopaging=1&category=' . $cat );
  // get post ids
  $pids = ( ! empty( $posts ) ) ? wp_list_pluck($posts, 'ID') : false;
  if ( ! empty($pids) ) {
    $pidstxt = implode($pids, ',');
    global $wpdb;
    // get the ids of media having retrieved posts as parent
    $mids = $wpdb->get_col("SELECT ID FROM $wpdb->posts WHERE post_parent IN ($pidstxt)");
    if ( ! empty($mids) ) {
      // force media query to retrieve only media having retrieved posts as parent
      $q->set( 'post__in', $mids );
    } else {
      // force media query to return no posts
      $q->set( 'p', -1 ); // let query found nothing
    }
  }
}

function my_add_media_cat_dropdown() {
  $scr = get_current_screen();
  if ( $scr->base !== 'upload' ) return;
  $cat = filter_input(INPUT_GET, 'postcat', FILTER_SANITIZE_STRING );   
  $selected = (int)$cat > 0 ? $cat : '-1';  
  $args = array(
      'show_option_none'   => 'All Post Categories',
      'name'               => 'postcat',
      'selected'           => $selected
  ); 
  wp_dropdown_categories( $args );
}

Negativ dieses Codes ist, dass Sie 3 Abfragen ausführen müssen, um die Medien zu filtern ...

Ergebnis auf der Benutzeroberfläche:

enter image description here

2
gmazzap