Supporto » Sviluppare con WordPress » assegnare valore di un custom field come featured image

  • arsenalemusica

    (@arsenalemusica)


    Mi rivolgo per la prima volta al forum italiano, sperando in un aiuto.

    Ho diversi custom-post-types che sul sito mostrano un immagine pescata dai custom-field, con chiave portfolio_image e valore dominio.com/image.jpg. In pratica vorrei prendere il valore e farlo diventare la featured-image del post, con una funzione che lavora in automatico per tutti i posts. Questo perchè altrimenti altri plugin non mi pescano l’immagine corrispondente a quei post.

    Ci sono plugin che trattano URL esterni come featured-image ma non li creano in automatico, bisogna inserirli manualmente. Ho però trovato un tutorial ma è vecchio e non funziona così come l’ho copiato. Non sono uno sviluppatore ma magari qualcuno può indicarmi dov’è l’errore o se bisogna scrivere una funzione completamente diversa.
    Ringrazio in anticipo.

    Ho trovato anche questo.

Stai vedendo 6 repliche - dal 1 al 6 (di 6 totali)
  • Moderatore Guido Scialfa

    (@wido)

    Ciao @arsenalemusica,

    Volendo potresti hookarti nella funzione che preleva la thumbnail e sovrascriverla con il valore del meta che indichi tu.

    Puoi sfruttare il filtro post_thumbnail_html che trovi in wp-includes/post-thumbnail-template.php nella funzione get_the_post_thumbnail() che è quella usata da the_post_thumbnail. Ovviamente se il tuo tema sfrutta questa funzione.

    Penso che in linea generale sia molto probabile.
    Comunque, potresti fare una cosa del tipo:

    
    add_filter('get_the_post_thumbnail', function($html) {
        $post = get_post();
        
        // Se per qualche motivo il post non può essere prelevato.
        if (! $post) {
            return $html;
        }
    
        // Effettuo controllo se il post type è valido.
        // Cambia i valori per 'post-type-name' con lo slug del tuo post type
        // Puoi aggiungerne altri separati da virgola es.
        // array('post-type-one', 'post-type-two')
        if (! in_array($post->post_type, array('post-type-name'), true)) {
            return $html;
        }
    
        // Prelevo il meta per il post corrente del loop.
        $newThumbnail = filter_var(
            get_post_meta($post->ID, 'portfolio_image', true),
            FILTER_SANITIZE_URL
        );
       
    
        // Se ho il valore lo sfrutto.
        if($newThumbnail) {
             $html = '<img src="' . esc_url($newThumbnail) . '" alt="" />';
        }
    
        return $html;
    });
    

    In caso volessi provarlo fai attenzione ai singoli e doppi apici, che siano quelli corretti e non quelli tipografici.

    La modifica meglio farla via ftp (codice non testato) ed in caso di problemi puoi sempre tornare indietro.

    • Questa risposta è stata modificata 2 mesi fa da  Guido Scialfa.
    • Questa risposta è stata modificata 2 mesi fa da  Guido Scialfa.
    • Questa risposta è stata modificata 2 mesi fa da  Guido Scialfa.
    arsenalemusica

    (@arsenalemusica)

    grazie per l’interessamento… preso così com’è il codice non funziona, manda il sito in blank. Sul forum inglese mi suggeriscono un’altra strada più diretta utilizzando set_post_thumbnail(). Ma come ho detto non saprei scrivere in PHP…

    Moderatore Guido Scialfa

    (@wido)

    Ciao @arsenalemusica,

    set_post_thumbnail richiede però un attachment in media perchè necessità dell’ID del media. Vedi https://codex.wordpress.org/Function_Reference/set_post_thumbnail tu se ho capito bene vuoi usare una url esterna quindi un file non caricato nei media.

    Corretto il codice mancava una chiusura di parentesi ora dovrebbe andare.

    arsenalemusica

    (@arsenalemusica)

    hai ragione sul fatto che richiede un file nella media library, ed infatti io voglio usare una url esterna (hotlinking che è autorizzato dall’utente). Probabilmente inserirò anche la possibilità di caricare i loro files, ma nel caso scegliessero l’hotlinking il sistema deve appunto includermi l’url in automatico nella featured-image. Quindi va bene l’idea di controllare se ci sia o meno un custom-field col key=portfolio-image. Ma forse, correggimi se sbaglio, quel key ci sarà sempre mentre è il value che sarà diverso (url esterno o interno)… in tal caso mi sembra che il tuo codice lo faccia. (ripeto, non sono uno sviluppatore ma cerco di leggere per capire… se avessi letto più attentamente avrei scoperto quella parentesi mancante).
    Due cose a proposito del codice:
    1) il sito ora non è blank, quindi presumo non ci siano conflitti di PHP, però non vedo il campo featured-image compilato. Forse mi aspettavo troppo ed il tuo codice non fa questo ma aggiunge una nuova tab “carica da url” alla pagina “scegli immagine” (che per altro si apre non più come popup ma come nuova pagina). Quindi si tratta sempre di un inserimento manuale, mentre io ho bisogno di un inserimento automatico on the fly.
    2) dato che utilizerei array(‘post-type-one’, ‘post-type-two’), come si include l’array nella riga successiva get_post_meta($post->ID, ‘portfolio_image’, true) per altri xxx_image, yyy_image ?

    Ti ringrazio per la pazienza, sto imparando :S

    Ciao @arsenalemusica

    Il campo devi crearlo tu o avvalerti di plugins come cmb2 o acf (advanced custom fields) che ti permettono di creare i metaboxes lato amministrativo, basta che come slug/name/key del meta assegni lo stesso nome che usi nella chiamata di funzione get_post_meta.

    Ti consiglio acf se vuoi poterli creare senza dover scrivere codice.

    Si la funzione preleva la url dal meta e la assegna come source al tag img.
    La funzione in alcun modo aggiunge campi lato backend.

    Riguardo alla 2. non capisco cosa intendi. Questa

    `
    if (! in_array($post->post_type, array(‘post-type-name’), true)) {
    return $html;
    }
    `

    Controlla che il post type sia uno di quelli abilitati ad usare la custom image, se vuoi aggiungerene altri ti basta separarli tra virgole come indicato nel commento del codice. Non hai necessità di aggiungere l’array nella stringa, serve solo come controllo. Poi la funzione continua cercando di prelevare la url dal post meta. Tutto qui.

    Se vuoi usare più post meta leggiti la doc https://developer.wordpress.org/reference/functions/get_post_meta/ il terzo parametro specifica se vuoi prelevarne uno solo o tutti i valori assegnati a quella key.

    Se poi vuoi crearne a parte altre key è un discorso diverso, devi avere un array delle key ciclarlo e richiamare i dati.

    Di preciso cosa vuoi ottenere?

    di preciso voglio solo ottenere che il backend inserisca l’immagine presa dal custom-field nella metabox Featured-Image. Ciò vale solo per i custom-post-types del mio tema, mentre non è necessario per post normali, e per questo avevo pensato di dover inserire i nomi degli stessi in un array.
    ACf non possi inserirlo perchè mi aveva già dato problemi.
    Ma segno tutte le preziose info che mi dai e le passerò ad uno sviluppatore. Per me è troppo complesso. 🙂

Stai vedendo 6 repliche - dal 1 al 6 (di 6 totali)
  • Devi essere collegato per rispondere a questo topic.