0

我在媒体条目的元数据中包含了 2 个自定义列,称为“摄影师”和“版权”。我已经在媒体库的管理视图中包含了这两个列,并使它们可排序。但是当我按其中一个排序时,结果会排除该列中具有 NULL 值的条目

将自定义字段添加到管理面板媒体视图

//Custom columns in Media Admin view

add_filter('manage_media_columns', 'media_additional_columns', 1);
function media_additional_columns($defaults){
    $defaults['photographer'] = __('Photographer');
    $defaults['copyright'] = __('Copyright');
    return $defaults;
}

//Fill Custom Media Admin Columns with content

add_action('manage_media_custom_column', 'media_custom_columns_attachment_id', 1, 2);
function media_custom_columns_attachment_id($column_name, $post_id){
   switch ( $column_name ) {
    case 'photographer':
      echo get_post_meta( $post_id, 'photographer', true );
      break;

    case 'copyright':
      echo get_post_meta( $post_id, 'copyright', true );
      break;
}
}


使管理面板媒体视图中的自定义列可排序

//make custom columns sortable

//add custom columns to array sortable columns
add_filter('manage_upload_sortable_columns', 'as_add_custom_column_sortable');
function as_add_custom_column_sortable($columns) {
    $columns['photographer'] = 'photographer';
    $columns['copyright'] = 'copyright';
    return $columns;
  }

//alter the post query in case stuff gets sorted by custom columns
  add_action( 'pre_get_posts', 'as_custom_column_orderby' );
  function as_custom_column_orderby( $query ) {
    if( ! is_admin() || ! $query->is_main_query() ) {
      return;
    }
    switch ($query->get( 'orderby')) {
      case 'photographer':
        $query->set( 'orderby', 'meta_value' );
        $query->set( 'meta_key', 'photographer' );
        break;
      case 'copyright':
        $query->set( 'orderby', 'meta_value' );
        $query->set( 'meta_key', 'copyright' );
        break;   
    }
  }

我想在排序表中包含具有 NULL 值的条目,在具有非 NULL 值的条目之后。

我发现这篇文章为帖子和用户回答了同样的问题。我认为适用于帖子的答案也适用于媒体,因为媒体基本上是附件类型的帖子,但事实并非如此,我的媒体库完全是空的。

我刚开始使用php,非常感谢帮助!

4

1 回答 1

0

好吧,我通过将代码直接放入插件文件而不是 functions.php 并添加代码来解决该问题

////update all images with default values for custom fields "Photographer" and "Copyright"
// Run the loop when the plugin is activated
register_activation_hook(__FILE__, 'as_update_my_metadata');
function as_update_my_metadata(){
    $args = array(
        'post_type' => 'attachment', // Only get the posts
        'post_status' => 'publish' OR 'private', // Only the posts that are published
        'posts_per_page'   => -1 // Get every post
    );
    $posts = get_posts($args);
    foreach ( $posts as $post ) {
        // Run a loop and update every meta data
        update_post_meta( $post->ID, 'photographer', 'unknown' );
        update_post_meta( $post->ID, 'copyright', 'not defined' );
    }
}
于 2021-04-01T22:06:58.077 回答