Tag: php

  • WordPress Notice _load_textdomain_just_in_time for Oxygen builder plugin

    WordPress Notice _load_textdomain_just_in_time for Oxygen builder plugin

    Hai mai visto questo notice?

    Notice: Function _load_textdomain_just_in_time was called <strong>incorrectly</strong>. Translation loading for the <code>oxygen</code> domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the <code>init</code> action or later. Please see <a href="https://developer.wordpress.org/advanced-administration/debug/debug-wordpress/">Debugging in WordPress</a> for more information. (This message was added in version 6.7.0.) in /home/<my-user>/public_html/wp-includes/functions.php on line 6260

    Ebbene non sai quanto rallenta l’interfaccia amministrativa di WordPress (back-end).

    Puoi fixarlo aggiungendo un semplice must-use plugin che sopperisce al fato che il team di Oxygen Builder non si è ancora adoperato a riguardo.

    Nota bene: nel mio caso il problema era presente sulla versione 4.9.7 di Oxygen Builder.

    Non sto qui a mostrare dati vari, ma ho riscontrato che era uno dei colli di bottiglia significativi che erano dietro la lentezza riscontrata dal cliente nell’usare il back-end di WordPress.

    Per risolverlo bisogna intervenire sul tempo di caricamento all’init di WordPress, come? Con un must use plugin.

    Aggiungete un file chiamato “oxygen-woocommerce-i18n-fix.php”, o come vi pare e mettete dentro questa roba:

    <?php
    /**
     * Plugin Name: Oxygen WooCommerce i18n timing fix
     * Description: Delays Oxygen WooCommerce initialization until after_setup_theme.
     */
    
    add_action(
        'plugins_loaded',
        function () {
            $priority = has_action(
                'plugins_loaded',
                'oxygen_woocommerce_init'
            );
    
            if ( false !== $priority ) {
                remove_action(
                    'plugins_loaded',
                    'oxygen_woocommerce_init',
                    $priority
                );
    
                add_action(
                    'after_setup_theme',
                    'oxygen_woocommerce_init',
                    0
                );
            }
        },
        -9999
    );
    

    Il notice sparirà e il vostro WordPress andrà un pochino meglio, non sarà un game changer, ma come diceva la nonna il pennello si fa un pelo alla volta.

    🪰🕸️

  • WordPress supporto all’upload dei file SVG

    WordPress supporto all’upload dei file SVG

    WordPress, per impostazione predefinita, non consente il caricamento dei file SVG nella libreria media. Il motivo è principalmente legato alla sicurezza: a differenza di formati come JPG o PNG, un file SVG è basato su XML e può contenere codice potenzialmente pericoloso. Per questo motivo, tentando di caricarlo, WordPress restituisce l’errore relativo al tipo di file non consentito.

    Per risolvere il problema ho aggiunto un piccolo snippet PHP che abilita il formato image/svg+xml tra i MIME type accettati e forza WordPress a riconoscere correttamente l’estensione .svg. Ho limitato questa possibilità agli utenti amministratori, evitando quindi che autori, editor o altri profili possano caricare liberamente questo tipo di file.

    Lo snippet può essere inserito nel functions.php di un child theme, in un plugin personalizzato oppure tramite un plugin come Code Snippets. Va comunque ricordato che l’abilitazione dell’upload non equivale alla sanificazione del file: è quindi opportuno caricare esclusivamente SVG prodotti internamente o provenienti da fonti affidabili.

    <?php
    
    /**
     * Allow SVG uploads for administrators only.
     */
    add_filter('upload_mimes', function (array $mimes): array {
        if (current_user_can('manage_options')) {
            $mimes['svg'] = 'image/svg+xml';
        }
    
        return $mimes;
    });
    
    /**
     * Ensure WordPress correctly recognises SVG files.
     */
    add_filter(
        'wp_check_filetype_and_ext',
        function (array $data, string $file, string $filename): array {
            if (
                current_user_can('manage_options') &&
                strtolower(pathinfo($filename, PATHINFO_EXTENSION)) === 'svg'
            ) {
                $data['ext']  = 'svg';
                $data['type'] = 'image/svg+xml';
            }
    
            return $data;
        },
        10,
        3
    );

    Lo script abilita la funzionalità di caricamento dei file svg solo per gli amministratori di wordpress.

  • Woocommerce prodotti variabili divenuti improvvisamente semplici

    Woocommerce prodotti variabili divenuti improvvisamente semplici

    Sto scrivendo questo post per il bene dell’umanità, perché nemmeno il più empio dei bipedi umanoidi del globo terraqueo merita di passare per quello che sono passato io.

    Vi dico subito che le soluzioni semplici sono le più efficaci e che se vi trovate nella situazione in cui, di punto in bianco, tutti i prodotti variabili del vostro sito sono divenuti semplici sia da backend che da frontend, allora questo articolo può aiutarvi.
    Più precisamente se il vostro prodotto fintamente semplice, quando siete in modifica e cambiate il tipo in variabile, carica delle pre-esistenti variazioni, e salvando bonificate la situazione, allora direi che siete proprio nel posto giusto.

    Non sto qui a spiegarvi tutti gli approcci che ho adottato e che sono miseramente falliti, andiamo direttamente al punto spiegando in primis qual era la situazione.

    Cosa era successo?

    Lo ignoro, ho ereditato questa grana da terzi e senza la possibilità di tornare in uno stato precedente, senza backup e senza informazione.
    Ho letto la qualunque sull’internet, per taluni si trattava di un conflitto ( interiore? 😀 ) ma nel mio caso:

    • disattivando tutti i plugin
    • passando al tema ad un tema di default (Twenty twenty three)
    • togliendo la cache dall’equazione
    • assicurandomi che la CDN non rompesse le scatole
    • riavviando il pc (ovviamente questo non l’ho fatto davvero!)

    e facendo tutte le altre prove che suggerisce l’intuizione o l’intelligenza artificiale non ho cavato un ragno dal buco. Zero carbonella, come dicono in capitale, nisba, nada … crio.

    Con un elenco di più di 500 prodotti affetti dal problema capite bene che andare lì manualmente a editare prodotto per prodotto sarebbe stato un guaio passato.

    Pertanto sono andato alla ricerca di fix programmatici, ho scritto plugin, soluzioni che eseguivano operazioni in batch e altre cose anche molto sofisticate, ma sono solo riuscito a sfondare l’archivio prodotti. Tristezza per favore vai via.

    Alla fine mi sono messo con calma zen e ho chiesto a chatgpt di farmi uno script che mi consentisse di ottenere un report in json descrittivo del prodotto.

    Tale fix sarebbe stato lanciato prima e dopo la modifica manuale del prodotto fintamente semplice in variabile (cosa che come vi ho già detto, aggiustava le cose).

    Ho preso il codice php che mi ha suggerito la lattina (povero ChatGPT) e ho creato un file report.php che ho messo nella root di wordpress per poterlo richiamare da browser, eccolo:

    <?php
    // Assicurati che questo file venga eseguito in un contesto WordPress
    require_once('./wp-load.php');

    if (!isset($_GET['product_id']) || !is_numeric($_GET['product_id'])) {
    header('Content-Type: application/json');
    echo json_encode(['error' => 'Missing or invalid product_id parameter.']);
    exit;
    }

    $product_id = intval($_GET['product_id']);
    $data = [];

    // Recupera dati da wp_posts
    $product_post = get_post($product_id);
    if ($product_post) {
    $data['post'] = [
    'ID' => $product_post->ID,
    'post_title' => $product_post->post_title,
    'post_type' => $product_post->post_type,
    'post_status' => $product_post->post_status,
    ];
    } else {
    $data['post'] = 'Product not found in wp_posts.';
    }

    // Recupera dati da wp_postmeta
    $postmeta = get_post_meta($product_id);
    $data['postmeta'] = $postmeta ?: 'No metadata found for this product.';

    // Recupera termini collegati nella tassonomia product_type
    $terms = wp_get_object_terms($product_id, 'product_type');
    if (!is_wp_error($terms)) {
    $data['taxonomy'] = array_map(function ($term) {
    return [
    'term_id' => $term->term_id,
    'name' => $term->name,
    'taxonomy' => $term->taxonomy,
    ];
    }, $terms);
    } else {
    $data['taxonomy'] = 'Error fetching terms: ' . $terms->get_error_message();
    }

    // Imposta l'intestazione per il JSON
    header('Content-Type: application/json');

    // Ritorna i dati in formato JSON
    echo json_encode($data, JSON_PRETTY_PRINT);

    Richiamando la url miosito.it/report.php?product_id=123, ho ottenuto il report relativo al prodotto, quindi ho salvato il prodotto da interfaccia cambiando manualmente il type da simple a variable e ho rigenerato il report.

    Dal confronto dei due file è emerso che si era sballata la tassonomia che gestisce il tipo prodotto. Se siete confusi è giusto che sia così, perché sappiate che c’è una tassonomia che gestisce il tipo prodotto …

    Tale tassonomia ha vari termini (uno per tipo di prodotto) e ciascuno ha il proprio identificativo (term_id). Il mio termine “variabile” aveva term_id = 842.

    Pertanto mi sono detto, perché non fare una bamonda query che prenda tutti i prodotti fintamente semplici e ci metta su, questa cavolo di associazione con il termine giusto?

    I prodotti fintamente semplici (e intrinsecamente variabili) erano reperibili verificando che avessero effettivamente almeno un post_parent che gli puntasse (ovvero le variazioni).

    Ha funzionato bene, ecco la query:

    -- Associare i prodotti fintamente variabili al termine "variable" (term_id 842)
    INSERT INTO wpon_term_relationships (object_id, term_taxonomy_id)
    SELECT
    p.ID AS product_id,
    842 AS term_taxonomy_id
    FROM
    wpon_posts AS p
    LEFT JOIN
    wpon_posts AS v ON v.post_parent = p.ID AND v.post_type = 'product_variation'
    LEFT JOIN
    wpon_term_relationships AS tr ON p.ID = tr.object_id
    LEFT JOIN
    wpon_term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
    LEFT JOIN
    wpon_terms AS t ON tt.term_id = t.term_id
    WHERE
    p.post_type = 'product' -- È un prodotto
    AND v.ID IS NOT NULL -- Ha variazioni associate
    AND (t.term_id IS NULL OR t.term_id != 842) -- Non è già associato a "variable"
    GROUP BY
    p.ID
    ON DUPLICATE KEY UPDATE term_taxonomy_id = VALUES(term_taxonomy_id);

    Ovviamente 842 è il mio id, trova il tuo nel database e modifica lo script prima di lanciarlo.

    ATTENZIONE: non essere dissennato EFFETTUA UN BACKUP prima di distruggere tutto.

    In fine

    Questo problema non voglio doverlo risolvere mai più! 🙂

    È stato uno stress non indifferente venire a capo dei perché e dei percome, spero torni utile a voi altri.