it-swarm.com.de

Textpositionierung in der Admin-Spalte

Ich habe meinem benutzerdefinierten Beitragstyp ein benutzerdefiniertes Feld hinzugefügt und kann es auf dem Admin-Übersichtsbildschirm ausgeben. Der Text scheint jedoch nicht mit der Spaltenüberschrift übereinzustimmen, und ich kann nicht herausfinden, warum.

 enter image description here 

Hier ist mein Code zu den Spalten:

public function __construct() {
    add_filter( 'manage_'.$this->attributes['slug'].'_posts_columns', [$this,'customAdminColumns'] );
    add_action( 'manage_'.$this->attributes['slug'].'_posts_custom_column' , [$this,'customAdminColumnData'], 10, 2 );
}

public function customAdminColumns($columns){
    $insert=array(
        'file_type' =>  'File Type'
    );

    array_splice($columns,3,0,$insert);

    return $columns;
}

public function customAdminColumnData($column,$post_id){
    switch($column){
        case 'file_type':
            $media_id=  get_post_meta($post_id,'downloads_file',true);

            echo get_post_mime_type($media_id);

            break;
    }
}

Ich bin mir ziemlich sicher, dass ich etwas übersehen habe, aber ich kann mir nicht vorstellen, was.

Kann jemand eine Anleitung dazu geben?

2
Burgi

Das Problem

Wenn Sie die Spalte (d. H. Die Spalte "Dateityp") überprüfen, wird in etwa das folgende Markup/HTML angezeigt:

<th scope="col" id="0" class="manage-column column-0 num">File Type</th>

und dies für ein td Element in dieser Spalte:

<td class="0 column-0" data-colname="File Type">text/csv</td>

Das Problem ist also, wie Sie in den Attributen id und class sehen können, das key der Spalte, das null (0) ist, wenn es file_type sein sollte, wie Sie unten sehen können:

<th scope="col" id="file_type" class="manage-column column-file_type">File Type</th>

<td class="file_type column-file_type" data-colname="File Type">text/csv</td>

Und das liegt daran, dass Sie in Ihrer customAdminColumns() -Funktion array_splice() verwendet haben. Wenn Sie das doc lesen, sehen Sie den folgenden Text:

Beachten Sie, dass die Schlüssel im Ersatz-Array nicht erhalten bleiben.

Beziehen Sie sich also auf Ihren Code:

$insert=array(
    'file_type' =>  'File Type'
);

array_splice($columns,3,0,$insert);

Der file_type-Schlüssel in $insert (das Ersatz-Array) bleibt nicht erhalten und PHP ändert ihn auf der Grundlage der eigenen Berechnung von/PHP in einen numerischen Schlüssel.

In mein Fall wurde der Schlüssel in 0 geändert.

Die Lösung

Option 1:Durchlaufen Sie das $columns-Array und fügen Sie das file_type-Element an der gewünschten Position ein.

public function customAdminColumns($columns){
    $columns2 = [];
    $i = 0;
    foreach ( $columns as $key => $label ) {
        if ( 3 === $i ) {
            $columns2['file_type'] = 'File Type';
        }
        $columns2[ $key ] = $label;
        $i++;
    }
    $columns = $columns2;
    unset( $columns2 );

    return $columns;
}

Option 2:Verwenden Sie array_slice() - schneiden Sie das $columns-Array bis zur gewünschten Position auf, fügen Sie das file_type-Element in das aufgeschnittene Array ein und fügen Sie dann die verbleibenden Elemente aus $columns hinzu.

public function customAdminColumns($columns){
    $columns2 = array_slice( $columns, 0, 3 );
    $columns2['file_type'] = 'File Type';
    $columns = $columns2 + array_slice( $columns, 3 );
    unset( $columns2 );

    return $columns;
}
1
Sally CJ