WooCommerce admin opombe naročil – HPOS, tooltip, datum in avtor

Pri delu z WooCommerce naročili se pogosto zgodi, da moramo hitro preveriti interne opombe ali sporočila za kupca, brez da bi vsakič odpirali posamezno naročilo. Privzeti WooCommerce tega ne omogoča.

V tem članku bomo pokazali, kako lahko v admin seznam naročil dodamo dva nova stolpca:

  • Opomba zame (interne opombe)
  • Opomba za kupca (customer notes)

Vsaka opomba je prikazana z:

  • barvnim ozadjem (rdeče / zeleno),
  • tooltipom, ki ob prehodu z miško pokaže datum in avtorja opombe,
  • popolno podporo za HPOS (High-Performance Order Storage) in legacy način.

Kaj omogoča ta snippet?

✔ Prikaz zadnje interne opombe neposredno v seznamu naročil
✔ Prikaz zadnje opombe za kupca brez klikanja v naročilo
✔ Tooltip z datumom in avtorjem opombe
✔ Podpora za:

  • nove WooCommerce instalacije (HPOS),
  • stare / nadgrajene trgovine (legacy način)
    ✔ Brez dodatnih vtičnikov ali JavaScripta

Zakaj je to uporabno?

Če dnevno obdeluješ več naročil, ti ta rešitev omogoča:

  • hitrejši pregled posebnih zahtev kupcev,
  • boljšo interno komunikacijo v ekipi,
  • manj klikov in manj napak,
  • boljši nadzor nad stanjem naročil.
JavaScript
/**
 * @snippet        WooCommerce – Naročila: Opombe v admin seznamu (HPOS + Legacy + tooltip datum/avtor)
 * @opis           Doda stolpca "Opomba zame" in "Opomba za kupca" v seznam naročil (HPOS in legacy)
 *                 ter prikaže zadnjo interno/kupčevo opombo z barvnim ozadjem in tooltipom (datum, avtor).
 * @verzija        1.2
 * @avtor          WP Lab – https://wplab.si
 */


/**
 * =========================================================
 * 1) DODAJANJE STOLPCEV (HPOS + Legacy)
 * =========================================================
 */

// HPOS (admin.php?page=wc-orders)
add_filter( 'manage_woocommerce_page_wc-orders_columns', 'wplab_add_order_note_columns' );

// Legacy (edit.php?post_type=shop_order)
add_filter( 'manage_edit-shop_order_columns', 'wplab_add_order_note_columns' );

function wplab_add_order_note_columns( $columns ) {

    $new_columns = array();
    $inserted    = false;

    foreach ( $columns as $key => $label ) {

        $new_columns[ $key ] = $label;

        // Primarno: takoj za "Status" (pogosto obstaja na obeh zaslonih)
        if ( $key === 'order_status' ) {
            $new_columns['opomba_zame']  = __( 'Opomba zame', 'theme_domain' );
            $new_columns['opomba_kupcu'] = __( 'Opomba za kupca', 'theme_domain' );
            $inserted = true;
        }
    }

    // Fallback: če stolpec "order_status" ne obstaja, dodaj na konec
    if ( ! $inserted ) {
        $new_columns['opomba_zame']  = __( 'Opomba zame', 'theme_domain' );
        $new_columns['opomba_kupcu'] = __( 'Opomba za kupca', 'theme_domain' );
    }

    return $new_columns;
}


/**
 * =========================================================
 * 2) PRIKAZ VSEBINE STOLPCEV (HPOS + Legacy)
 * =========================================================
 */

// HPOS render stolpcev
add_action( 'manage_woocommerce_page_wc-orders_custom_column', 'wplab_display_order_note_columns', 10, 2 );

// Legacy render stolpcev
add_action( 'manage_shop_order_posts_custom_column', 'wplab_display_order_note_columns', 10, 2 );

function wplab_display_order_note_columns( $column, $order ) {

    // Legacy action pogosto pošlje $order_id (int), HPOS pa WC_Order objekt
    $order_id = is_a( $order, 'WC_Order' ) ? $order->get_id() : absint( $order );
    if ( ! $order_id ) {
        echo '<small><em>–</em></small>';
        return;
    }

    // Helper: tooltip (datum + avtor)
    $build_tooltip = function( $note ) {

        $date_str = '—';
        if ( isset( $note->date_created ) && is_a( $note->date_created, 'WC_DateTime' ) ) {
            $date_str = $note->date_created->date_i18n( 'd.m.Y H:i' );
        }

        $author = '—';
        if ( ! empty( $note->added_by ) ) {
            $author = $note->added_by;
        } elseif ( ! empty( $note->author ) ) {
            $author = $note->author;
        }

        return sprintf( 'Datum: %s | Avtor: %s', $date_str, $author );
    };

    // Helper: izriši note box
    $render_note_box = function( $note, $bg ) use ( $build_tooltip ) {

        $tooltip = $build_tooltip( $note );

        echo '<div
            title="' . esc_attr( $tooltip ) . '"
            style="background:' . esc_attr( $bg ) . '; padding:6px; border-radius:4px; cursor:help;"
        >' .
            wp_kses_post( $note->content ) .
        '</div>';
    };

    // INTERNAL OPOMBA (zame)
    if ( $column === 'opomba_zame' ) {

        $notes = wc_get_order_notes( array(
            'order_id' => $order_id,
            'limit'    => 1,
            'orderby'  => 'date_created',
            'order'    => 'DESC',
            'type'     => 'internal',
        ) );

        if ( ! empty( $notes ) ) {
            $render_note_box( current( $notes ), '#ffe5e5' );
        } else {
            echo '<small><em>–</em></small>';
        }

        return;
    }

    // CUSTOMER OPOMBA (kupcu)
    if ( $column === 'opomba_kupcu' ) {

        $notes = wc_get_order_notes( array(
            'order_id' => $order_id,
            'limit'    => 1,
            'orderby'  => 'date_created',
            'order'    => 'DESC',
            'type'     => 'customer',
        ) );

        if ( ! empty( $notes ) ) {
            $render_note_box( current( $notes ), '#c9e1c7' );
        } else {
            echo '<small><em>–</em></small>';
        }

        return;
    }
}
Deli vsebino

Leave a Reply

Vaš e-naslov ne bo objavljen. * označuje zahtevana polja