Come modifico i parametri PHPMailer per inviare le mail da un altro SMTP server

La funzione wp_mail() utilizza la classe PHPMailer per inviare le email attraverso il PHP. Attrverso l’action hook phpmailer_init è possibile modificare i parametri come hostname, porta, tipo di autenticazione, user e pass. Il codice va inserito nel file functions.php del tema.

function sg_send_smtp_email( $phpmailer ) {
	$phpmailer->isSMTP();
	$phpmailer->Host       = 'smtp.example.com';
	$phpmailer->SMTPAuth   = true;
	$phpmailer->Port       = '25';
	$phpmailer->Username   = 'user@example.com';
	$phpmailer->Password   = 'smtp password';
	$phpmailer->SMTPSecure = 'tls'; //ssl, starttls
	$phpmailer->From       = 'website@example.com';
	$phpmailer->FromName   = 'e.g Website Name';

	if(WP_DEBUG){
		add_action('wp_mail_failed', function ($error) {
			error_log($error->get_error_message());
		});
	}
}
add_action( 'phpmailer_init', 'sg_send_smtp_email' );

Come aggiungo delle colonne ordinabili negli elenchi di un custom post type in wordpress admin?

Supponiamo che il custom post type in questione si chiama “EVENTO”, e vogliamo mostrare data di inizio e data di fine nelle liste dei post nel backend.

Per prima cosa useremo due filtri per fare questo.

Il primo sarà “manage_edit-{SLUG-POST-TYPE}_columns” nel nostro caso “manage_edit-evento_columns”. Questo filtro ci permetterà di creare le colonne dove poi mostreremo le date.

Il secondo sarà “manage_{SLUG-POST-TYPE}_posts_custom_column” nel nostro caso “manage_evento_posts_custom_column“. Questo filtro ci permettrà di popolare le righe delle nostre colonne con le date di inizio e fine evento.

Scriviamo la funzione per il primo filtro.

/**
 * add extra columns to post type evento 
 * 
 * @author Toni Guga <toni@schiavoneguga.com>
 * @param [type] $columns
 * @return void
 */
function evento_extra_columns($columns)
{

    $columns['evento_data_inizio'] = __('Data di Inizio', 'your-translate-text-domain');
    $columns['evento_data_fine'] = __('Data di Fine', 'your-translate-text-domain');

    return $columns;
}
add_filter('manage_edit-evento_columns', 'evento_extra_columns', 10);

Scriviamo la funzione per il secondo filtro.

/**
 * populate evento extra columns with data
 * 
 * @author Toni Guga <toni@schiavoneguga.com>
 * @param [type] $column
 * @return void
 */
function evento_extra_columns_content($column)
{
    global $post;

    //esempio con campi ACF
    if ('evento_data_inizio' === $column) {
        echo get_field('data_di_fine', $post->ID);
    } elseif ('data_di_inizio' === $column) {
        echo get_field('data_di_fine', $post->ID);
    } 

    // esempio con un custom field
    // echo get_post_meta($post->ID, 'data_di_fine', true);

}
add_action('manage_evento_posts_custom_column', 'evento_extra_columns_content');

Se si usano solo queste due funzioni otteniamo due colonne con i dati che però non possono essere ordinabili.

Per rendere ordinabli queste colonne abbiamo bisogno ancora di due piccole funzioni, che verranno richiamate in altretanti filtri.

Primo filtro “manage_edit-{SLUG-POST-TYPE}_sortable_columns” nel nostro caso “manage_edit-evento_sortable_columns”.

Secondo filtro “pre_get_posts” che serve per passare i paramentri giusti per ordinare i dati nelle colonne.

Scriviamo la funzione per il primo filtro.

/**
 * make this extra columns sortable
 *
 * @author Toni Guga <toni@schiavoneguga.com>
 * @param [type] $columns
 * @return void
 */
function evento_extra_columns_content_sortable($columns)
{
    $columns['evento_data_inizio'] = 'evento_data_inizio';
    $columns['evento_data_fine'] = 'evento_data_fine';

    //To make a column 'un-sortable' remove it from the array
    //unset($columns['date']);

    return $columns;
}
add_filter('manage_edit-evento_sortable_columns', 'evento_extra_columns_content_sortable');

Scriviamo la funzione per il secondo filtro.

/**
 * adjust orderby query
 * 
 * @author Toni Guga <toni@schiavoneguga.com>
 * @param [type] $query
 * @return void
 */
function mbc_admin_columns_orderby($query)
{
    // limitia utilizzo solo per il beckend
    if (!is_admin()) {
        return;
    }

    $post_type = $query->get('post_type');
    $order_by = $query->get('orderby');

    if ('evento_data_inizio' == $orderby) {

        $query->set('meta_key', 'data_di_fine');
        $query->set('orderby', 'meta_value');
        // usa meta_value_num in caso di numeri

    } elseif ('evento_data_fine' == $orderby) {

        $query->set('meta_key', 'data_di_fine');
        $query->set('orderby', 'meta_value');
        // usa meta_value_num in caso di numeri

    }
}
add_action('pre_get_posts', 'mbc_admin_columns_orderby');

Bene salvo refusi questo codice dovrebbe funzionare, e si può adattare a qualsiasi post type custom o standard ed anche a tipi di dati differenti da mostrare.

Come faccio a impostare una directory per il post type nativo di wordpress e riscrivere i permalink dei post?

function sg_register_post_type_args($args, $post_type)
{

    if ('post' === $post_type) {
        $args['rewrite']['slug'] = 'news';
    }

    return $args;
}

add_filter('register_post_type_args', 'sg_register_post_type_args', 10, 2);


function sg_pre_post_link($permalink, $post, $leavename)
{
    // filtered by post_type, returns the format permalink
    if ('post' === $post->post_type) {
        return '/news/%postname%';
    }
    return $permalink;
}

add_filter('pre_post_link', 'sg_pre_post_link', 9, 3);

Come aggiungo in automatico un prefisso allo slug quando creo articolo su wordpress?

Un cliente mi ha chiesto questa funzionalità al quanto insolita ma allo stesso tempo interessante. Voleva che ogni per articolo creato sul post standard di wordpress avesse il prefisso news nello slug (post_title). Ho fatto una ricerca ed ho trovato una soluzione sul forum di toolset, che riporto qui con la speranza che torni utile a qualcuno.

function sg_update_post_name($post_id, $post, $update)
{
    remove_action('save_post', 'sg_update_post_name', 30, 3);
    
    if ($post->post_type == 'post') {
        wp_update_post(array(
            'ID' => $post_id,
            'post_name' => "news-" . sanitize_title($post->post_title)
        ));
    }

    add_action('save_post', 'sg_update_post_name', 30, 3);
}
add_action('save_post', 'sg_update_post_name', 30, 3);



function sg_change_post_name_slug($permalink, $post_id, $title, $name, $post)
{
    if (defined('DOING_AJAX') && DOING_AJAX and $_REQUEST['action'] == 'sample-permalink') {

        if ($post->post_type == 'post') {
            $permalink[1] = "news-" . sanitize_title($title);
        } 

    }
    return $permalink;
}
add_filter('get_sample_permalink', 'sg_change_post_name_slug', 10, 5);

WPML come recupero url della lingua di una pagina dallo slug?

WPML è il plugin per WordPress più utilizzato per creare e gestire un sito in multilingua. Spesso durante lo sviluppo di un sito capita di avere l’esigenza di stampare in modo dinamico l’URL della lingua corrente di una pagina. Per fare questo usiamo il filtro wpml_permalink più le funzioni di wordpress get_permalink() e get_page_by_path()

$wpml_permalink = apply_filters('wpml_permalink', get_permalink(get_page_by_path('slug_pagina')), ICL_LANGUAGE_CODE);

echo $wpml_permalink;

Come mostro l’elenco dei nomi delle categorie di un post di WordPress senza link separate per virgola?

Per fare questo tipo di output utilizziamo le due funzioni native di wordpress senza doverne creare una nuova. La prima funzione è quella che restituisce la lista delle categorie associate ad un post che si chiama get_the_category_list(  ) la seconda è la funzione che elimina tutti i tag html inclusi script js e stili css che si chiama wp_strip_all_tags( ). La formula è la seguente e va inserita nei template file single.php o single-{post_type}.php.

<?php 
    echo wp_strip_all_tags(get_the_category_list(', ')); 
    // risultato esmpio di output: News, Coorporate, Press release
    // al posto della virgola 
?>

Come stampo il nome della prima categoria di un post di WordPress senza il link?

/*
 *
 * studio42_get_the_category_name()
 * funzione che stampa il nome di una categoria di un post
 * @author toni@schiavoneguga.com
 * 
 * questa funzione va inserita nel file functions.php del tema figlio oppure del tema padre
 * funziona solo con le categre native di wordpress
 */

function studio42_get_the_category_name()
{
    $category = get_the_category();
    return $category[0]->cat_name;
}

// va inserita nel file single.php o single-post.php
echo studio42_get_the_category_name();

Come verificare se una data è un giorno del fine settimana con il PHP?

Con questa semplice funzione PHP è possibile controllare se una data è un giorno del fine settimana oppure no. La funzione accetta la data nel seguente formato numerico: anno / mese / giorno es 2025/06/07 che sarà un sabato.

/**
 * 
 * controlla se il giorno è di un weekend
 * @return bolean
 * @author toni@schiavoneguga.com
 * 
 */

function is_weekend($date)
{
    return (date('N', strtotime($date)) >= 6) ? true : false;
}

if(is_weekend('2025/06/07')){
    echo 'si è un giorno del fine settimana';
}else{
    echo 'non è un giorno del fine settimana';
}

// risultato si è un giorno del fine settimana


Come rimuovere i duplicati in un array multi-dimensionale in PHP?

E’ possibile farlo usando la funzione nativa PHP array_unique() con l’aggiunta del flag SORT_REGULAR. Vedi esempio sotto.

// array di test con valori duplicati
$brands = array(
    array(
        'brand_id' => 10,
    ),
    array(
        'brand_id' => 10,
    ),
    array(
        'brand_id' => 32,
    ),
    array(
        'brand_id' => 32,
    ),
    array(
        'brand_id' => 43,
    ),
    array(
        'brand_id' => 43,
    ),
);

// Processiamo l'array $brands con la funzione array_unique con il flag SORT_REGULAR e salviamola in una variabile $unique
$unique = array_unique($brands, SORT_REGULAR);

// Stampiamo il risultato della variabile $unique
var_dump($unique);

//Risultato array pulito dai duplicati
array(3) {
  [0]=>
  array(1) {
    ["brand_id"]=>
    int(10)
  }
  [2]=>
  array(1) {
    ["brand_id"]=>
    int(32)
  }
  [4]=>
  array(1) {
    ["brand_id"]=>
    int(43)
  }
}

Come verificare che un url è di youtube, vimeo o facebook con php?

Con questa funzione è possibile verificare se una parola chiave ($keyword) è presente in un URL ($url). La funzione restituisce un valore boleano true / false. True quando viene trovata la parola chiave nel URL, False quando non viene trovata.

/**
 * controlla se un URL ha una parola chiave
 *
 * @param {string} url
 * @param {string} keyword es. youtube
 * @return bol
 * @author Toni Guga <toni@schiavoneguga.com>
 */

function studio42_does_url_has_keyword($url='', $keyword='')
{
    if (strpos($url, $keyword) > 0) {
        return true;
    } else {
        return false;
    }
}


// esempio di utilizzo dichiarando le variabili prima

$url = 'https://www.youtube.com/watch?v=81qVzKjv4wI';
$keyword = 'youtube';

if(studio42_does_url_has_keyword($url, $keywork)){
    echo 'si è youtube';
}else{
    echo 'non è youtube';
} 

// risultato si è youtube



// esempio di utilizzo senza dichiarare le variabili prima

if(studio42_does_url_has_keyword('https://www.youtube.com/watch?v=81qVzKjv4wI', 'youtube')){
    echo 'si è youtube';
}else{
    echo 'non è youtube';
} 

// risultato si è youtube