Fügen Sie 'Beschreibung' zur Taxonomie 'Schnellbearbeitung' hinzu

7

Dies scheint ziemlich einfach zu sein, aber ich kann keine eindeutige Anleitung zum Hinzufügen des Taxonomiebeschreibungsfelds zum Schnellbearbeitungsfeld finden.

Ich habe mehrere Tutorials zum Hinzufügen von Feldern zum benutzerdefinierten Schnellbearbeitungsfeld befolgt, aber die Kernfelder (Name, Beschreibung und Slug) folgen nicht den gleichen Richtlinien wie das Hinzufügen von benutzerdefinierten Feldern zum Taxonomie-Schnellbearbeitungsfeld.

Ist das überhaupt möglich? Wenn nicht, ist es wahrscheinlich die beste Alternative, ein weiteres Meta-Feld "Beschreibung" zu erstellen und es auf diese Weise zum Schnellbearbeitungsfeld für die Taxonomie hinzuzufügen.

Roc
quelle

Antworten:

15

Normalerweise sollten wir zum Hinzufügen von Feldern zum Schnellbearbeitungsfeld einen 'quick_edit_custom_box'Aktions-Hook verwenden, der nur für benutzerdefinierte Spalten ausgelöst wird, da Kernspalten explizit ausgeschlossen sind ( siehe Code ).

Wenn wir eine benutzerdefinierte Spalte hinzufügen, wird diese in der Listentabelle angezeigt, ist jedoch nicht sinnvoll, da die Spaltenbeschreibung bereits vorhanden ist.

Wir haben jedoch die Möglichkeit, eine unsichtbare Spalte mit zwei Tricks hinzuzufügen :

  1. Setzen Sie die Beschriftung auf eine leere Zeichenfolge (auf diese Weise wird sie in den Einstellungen für "Bildschirmoption" nicht angezeigt).
  2. Erzwingen Sie das Ausblenden der Säule am get_user_option_manageedit-{$taxonomy}columnshiddenFilterhaken

Erstellen Sie zuerst die unsichtbare Spalte:

/* 
 * This is NOT required, but I'm using it to easily let you customize the taxonomy
 * where to add the inline description.
 * You can replace $the_target_tax in all the code with the name of your taxonomy,
 * with no need to use the global variable.
 */
global $the_target_tax;
$the_target_tax = 'category';

add_filter( "manage_edit-{$the_target_tax}_columns", function( $columns ) {
    $columns['_description'] = '';
    return $columns;
});

add_filter( "manage_{$the_target_tax}_custom_column", function( $e, $column, $term_id ) {
    if ( $column === '_description' ) return '';
}, 10, 3 );

add_filter( "get_user_option_manageedit-{$the_target_tax}columnshidden", function( $r ) {
    $r[] = '_description';
    return $r;
});

Jetzt haben wir eine benutzerdefinierte Spalte '_description', die unsichtbar ist, aber verwendet werden kann, um zusätzliche Felder über 'quick_edit_custom_box'Hook einzufügen:

Dieser Hook übergibt jedoch keinen aktuellen Wert, um das Feld mit der aktuellen Beschreibung vorab zu füllen. Wir können jedoch einige Zeilen von jQuery verwenden, um dies zu tun:

add_action( 'quick_edit_custom_box', function( $column, $screen, $tax ) {
    if ( $screen !== 'edit-tags' ) return;
    $taxonomy = get_taxonomy( $tax );
    if ( ! current_user_can( $taxonomy->cap->edit_terms ) ) return;
    global $the_target_tax;
    if ( $tax !== $the_target_tax || $column !== '_description' ) return;
    ?>
    <fieldset>
        <div class="inline-edit-col">
        <label>
            <span class="title"><?php _e('Description'); ?></span>
            <span class="input-text-wrap">
            <textarea id="inline-desc" name="description" rows="3" class="ptitle"></textarea>
            </span>
        </label>
        </div>
    </fieldset>
    <script>
    jQuery('#the-list').on('click', 'a.editinline', function(){
        var now = jQuery(this).closest('tr').find('td.column-description').text();
        jQuery('#inline-desc').text( now );
    });
    </script>
    <?php
}, 10, 3 );

Nachdem wir das Formular haben, müssen wir die Daten beim Senden speichern, ganz einfach mit "edited_{$taxonomy}"hook:

function save_inline_description( $term_id ) {
    global $the_target_tax;
    $tax = get_taxonomy( $the_target_tax );
    if (
        current_filter() === "edited_{$the_target_tax}"
        && current_user_can( $tax->cap->edit_terms )
    ) {
        $description = filter_input( INPUT_POST, 'description', FILTER_SANITIZE_STRING );
        // removing action to avoid recursion
        remove_action( current_filter(), __FUNCTION__ );
        wp_update_term( $term_id, $the_target_tax, array( 'description' => $description ) );
    }
}
add_action( "edited_{$the_target_tax}", 'save_inline_description' );

Code wurde schnell getestet und scheint zu funktionieren. Beachten Sie, dass PHP 5.3+ erforderlich ist.

Beschreibung zur schnellen Bearbeitung der Taxonomie hinzufügen

gmazzap
quelle
1
Hey GM! Vielen Dank für die Erklärung. Das ist großartig und ich hätte dies nicht tun können, wenn Sie nicht geholfen hätten. Sehr geschätzt. Wenn die 'Beschreibung' im Feld Schnellbearbeitung gespeichert wird und Sie erneut auf die Schnellbearbeitung zugreifen, wird der alte Text weiterhin angezeigt und die von mir geschriebenen benutzerdefinierten JS werden nicht mehr ausgeführt. Ich weiß, dass dies an AJAX liegt, bin mir aber nicht sicher, wie ich das Skript innerhalb der 2. Funktion neu laden soll. Gibt es einen Tipp zum erneuten Laden des benutzerdefinierten Skripts? DANKE nochmal übrigens.
Roc
@Roc Das Problem war, dass WordPress das Bearbeitungsformular über Javascript klont. Wenn ich also den aktuellen Wert auf den Textbereich setze, existiert das gesuchte Formular nicht mehr. Daher muss ich die Aktion nicht nur für Dokumente ausführen , aber bei jedem Klick, jQuery.on()damit es mit Ajax funktioniert. Die Antwort wurde bearbeitet (nur das Javascript), jetzt funktioniert es.
gmazzap
0

Ich wollte nur darauf hinweisen, dass ich den Code nicht zum Laufen bringen konnte, ohne den Parameter 'category' in meinen benutzerdefinierten Taxonomienamen zu ändern.

Zum Beispiel:

wp_update_term( $term_id, 'category', array( 'description' => $description ) );

wurde ersetzt durch:

wp_update_term( $term_id, 'my_custom_tax_name', array( 'description' => $description ) );

Prost!

Löwe
quelle