Breadcrumbs su WordPress

Sviluppo Breadcrumbs Wordpress

Come aggiungere i Breadcrumbs su WordPress senza l'uso di plugin

Le breadcrumbs, assumo un’importanza sempre maggiore, poichè aiutano utenti e motori di ricerca a comprendere la struttura di un sito.
Soprattutto all'interno di un piccolo-sito o e-commerce woocommerce,
implementando questo codice all'interno del file function.php del proprio tema:
(fate sempre una copia del file function.php, meglio nel tema child)

function the_breadcrumb () {

// Settings 
$separator  = '>';
$id         = 'breadcrumbs';
$class      = 'breadcrumbs';
$home_title = 'Homepage';

// Get the query & post information
global $post,$wp_query;
$category = get_the_category();

// Build the breadcrums
echo '<ul id="' . $id . '" class="' . $class . '">';
// Do not display on the homepage
if ( !is_front_page() ) {

// Home page
echo '<li class="item-home"><a class="bread-link bread-home" href="' . get_home_url() . '" title="' . $home_title . '">' . $home_title . '</a></li>';
echo '<li class="separator separator-home"> ' . $separator . ' </li>';

if ( is_single() ) {

// Single post (Only display the first category)
echo '<li class="item-cat item-cat-' . $category[0]->term_id . ' item-cat-' . $category[0]->category_nicename . '"><a class="bread-cat bread-cat-' . $category[0]->term_id . ' bread-cat-' . $category[0]->category_nicename . '" href="' . get_category_link($category[0]->term_id ) . '" title="' . $category[0]->cat_name . '">' . $category[0]->cat_name . '</a></li>';
echo '<li class="separator separator-' . $category[0]->term_id . '"> ' . $separator . ' </li>';
echo '<li class="item-current item-' . $post->ID . '"><strong class="bread-current bread-' . $post->ID . '" title="' . get_the_title() . '">' . get_the_title() . '</strong></li>';

} else if ( is_category() ) {

// Category page
echo '<li class="item-current item-cat-' . $category[0]->term_id . ' item-cat-' . $category[0]->category_nicename . '"><strong class="bread-current bread-cat-' . $category[0]->term_id . ' bread-cat-' . $category[0]->category_nicename . '">' . $category[0]->cat_name . '</strong></li>';

} else if ( is_page() ) {

// Standard page
if( $post->post_parent ){

// If child page, get parents
$anc = get_post_ancestors( $post->ID );

// Get parents in the right order
$anc = array_reverse($anc);

// Parent page loop
foreach ( $anc as $ancestor ) {
$parents .= '<li class="item-parent item-parent-' . $ancestor . '"><a class="bread-parent bread-parent-' . $ancestor . '" href="' . get_permalink($ancestor) . '" title="' . get_the_title($ancestor) . '">' . get_the_title($ancestor) . '</a></li>';
$parents .= '<li class="separator separator-' . $ancestor . '"> ' . $separator . ' </li>';
}

// Display parent pages
echo $parents;

// Current page
echo '<li class="item-current item-' . $post->ID . '"><strong title="' . get_the_title() . '"> ' . get_the_title() . '</strong></li>';

} else {

// Just display current page if not parents
echo '<li class="item-current item-' . $post->ID . '"><strong class="bread-current bread-' . $post->ID . '"> ' . get_the_title() . '</strong></li>';

}

} else if ( is_tag() ) {

// Tag page

// Get tag information
$term_id = get_query_var('tag_id');
$taxonomy = 'post_tag';
$args ='include=' . $term_id;
$terms = get_terms( $taxonomy, $args );

// Display the tag name
echo '<li class="item-current item-tag-' . $terms[0]->term_id . ' item-tag-' . $terms[0]->slug . '"><strong class="bread-current bread-tag-' . $terms[0]->term_id . ' bread-tag-' . $terms[0]->slug . '">' . $terms[0]->name . '</strong></li>';

} elseif ( is_day() ) {

// Day archive

// Year link
echo '<li class="item-year item-year-' . get_the_time('Y') . '"><a class="bread-year bread-year-' . get_the_time('Y') . '" href="' . get_year_link( get_the_time('Y') ) . '" title="' . get_the_time('Y') . '">' . get_the_time('Y') . ' Archives</a></li>';
echo '<li class="separator separator-' . get_the_time('Y') . '"> ' . $separator . ' </li>';

// Month link
echo '<li class="item-month item-month-' . get_the_time('m') . '"><a class="bread-month bread-month-' . get_the_time('m') . '" href="' . get_month_link( get_the_time('Y'), get_the_time('m') ) . '" title="' . get_the_time('M') . '">' . get_the_time('M') . ' Archives</a></li>';
echo '<li class="separator separator-' . get_the_time('m') . '"> ' . $separator . ' </li>';

// Day display
echo '<li class="item-current item-' . get_the_time('j') . '"><strong class="bread-current bread-' . get_the_time('j') . '"> ' . get_the_time('jS') . ' ' . get_the_time('M') . ' Archives</strong></li>';

} else if ( is_month() ) {

// Month Archive

// Year link
echo '<li class="item-year item-year-' . get_the_time('Y') . '"><a class="bread-year bread-year-' . get_the_time('Y') . '" href="' . get_year_link( get_the_time('Y') ) . '" title="' . get_the_time('Y') . '">' . get_the_time('Y') . ' Archives</a></li>';
echo '<li class="separator separator-' . get_the_time('Y') . '"> ' . $separator . ' </li>';

// Month display
echo '<li class="item-month item-month-' . get_the_time('m') . '"><strong class="bread-month bread-month-' . get_the_time('m') . '" title="' . get_the_time('M') . '">' . get_the_time('M') . ' Archives</strong></li>';

} else if ( is_year() ) {

// Display year archive
echo '<li class="item-current item-current-' . get_the_time('Y') . '"><strong class="bread-current bread-current-' . get_the_time('Y') . '" title="' . get_the_time('Y') . '">' . get_the_time('Y') . ' Archives</strong></li>';

} else if ( is_author() ) {

// Auhor archive

// Get the author information
global $author;
$userdata = get_userdata( $author );

// Display author name
echo '<li class="item-current item-current-' . $userdata->user_nicename . '"><strong class="bread-current bread-current-' . $userdata->user_nicename . '" title="' . $userdata->display_name . '">' . 'Author: ' . $userdata->display_name . '</strong></li>';

} else if ( get_query_var('paged') ) {

// Paginated archives
echo '<li class="item-current item-current-' . get_query_var('paged') . '"><strong class="bread-current bread-current-' . get_query_var('paged') . '" title="Page ' . get_query_var('paged') . '">'.__('Page') . ' ' . get_query_var('paged') . '</strong></li>';

} else if ( is_search() ) {

// Search results page
echo '<li class="item-current item-current-' . get_search_query() . '"><strong class="bread-current bread-current-' . get_search_query() . '" title="Search results for: ' . get_search_query() . '">Search results for: ' . get_search_query() . '</strong></li>';

} elseif ( is_404() ) {

// 404 page
echo '<li>' . 'Error 404' . '</li>';
}

}

echo '</ul>';

}

?>

Inserire un’altro codice nel template per richiamare la funzione, nella posizione nella quale vogliamo che i breadcrumbs siano mostrati:

<?php the_breadcrumb(); ?> 

In seguito agiremo via CSS...

Woocommerce select attributi dettaglio prodotto

Grazie a jQuery possiamo interagire e trasfomare il <select>

WordPress con il plugin Woocommerce è una buona soluzione per un piccolo e-shop/e-commerce, spesso però nel dettaglio prodotto abbiamo diverse necessità.
Woocommerce gestisce gli attributi delle variabili in <select> questo script permette di convertire quest ultimo in una lista <ul> <li>, per rendere più friendly la vendita, ad esempio nella visualizzazione di tutte le taglie:

$('select').each(function(){
    var $this = $(this), numberOfOptions = $(this).children('option').length;
    $this.addClass('select-hidden'); 
    $this.wrap('<div class="select"> </div>');
    $this.after('<div class="select-styled"> </div>');
    var $styledSelect = $this.next('div.select-styled');
    $styledSelect.text($this.children('option').eq(0).text());
    var $list = $('', {
        'class': 'select-options'
    }).insertAfter($styledSelect);
    for (var i = 0; i < numberOfOptions; i++) {
        $('', {
            text: $this.children('option').eq(i).text(),
            rel: $this.children('option').eq(i).val()
        }).appendTo($list);
    }
    var $listItems = $list.children('li');
    $styledSelect.click(function(e) {
        e.stopPropagation();
        $('div.select-styled.active').not(this).each(function(){
            $(this).removeClass('active').next('ul.select-options').hide();
        });
        $(this).toggleClass('active').next('ul.select-options').toggle();
    });
    $listItems.click(function(e) {
        e.stopPropagation();
        $styledSelect.text($(this).text()).removeClass('active');
        $this.val($(this).attr('rel'));
        $list.hide();
        //console.log($this.val());
    });
    $(document).click(function() {
        $styledSelect.removeClass('active');
        $list.hide();
    });
});
 

Disabilitare recensioni WooCommerce

woocommerce developer

WooCommerce non permette di disabilitare la tab delle recensioni

Il codice “modifica” la variabile $tabs che ci permette di disabilitare recensioni WooCommerce.

 All'interno del nostro function.php:

// Inizio codice

add_filter( 'woocommerce_product_tabs', 'sb_woo_remove_reviews_tab', 98);
function sb_woo_remove_reviews_tab($tabs) {

unset($tabs['reviews']);

return $tabs;
} 

Salva

Cambiare url wp-admin senza l'uso di plugin

undefined

CAMBIARE LA URL DELLA LOGIN su WP

Per accedere ad un sito wordpress si deve accedere al login che si trova url miostio./wp-admin.
Questo però rende più vulnerabile il sito stesso da attacchi Brute-force attack.

Per conrastare qualche mal intezionato potremmo cambiare utl/wp-admin con una parola a nostro piacere, come "loripsum"
Ci sono diversi plugin che offrono questo servizio, il più famoso è Rename wp-login.php compatibile anche con la versione Wordpress 4.6, ma se non vogliamo per necessità tecniche appesantire troppo il nostro WP con tanti plugin potremmo ottenere lo stesso risultato inserendo queste rige di codice:

wp-config.php inserire:

DEFINE(‘WP_ADMIN_DIR’, ‘loripsum’);
DEFINE (‘ADMIN_COOKIE_PATH’, ‘SITECOOKIEPATH.WP_ADMIN_DIR); 

function.php :

add_filter(‘site_url’, ‘wpadmin_filter’, 10,3);
function wpadmin_filter($url,$path,$orig_scheme) {
$old = array(“/(wp-admin)/”);
$admin_dir = WP_ADMIN_DIR;
$new = array($admin_dir);
return preg_replace($old, $new, $url, 1); 
}

.htaccess :

RewriteRule ^miaparola/(.*) wp-admin/$1?%{QUERY_STRING} [L]

Salva

WordPress 4.6 release

undefined

WordPress 4.6 le ultime novità

Processo di installazione di temi e plugin semplificato

- Ora avviene tutto su un unica pagina

Utilizzo di font disponibili

- WordPress prevede che sia usato il font default installato sul tuo sistema operativo

Controllo automatico dei link non funzionanti Broken Link Checker

- Segnalazione automatica se un link che hai inserito non è valido

Salvataggio automatico delle bozze

- WordPress 4.6 effettua salvataggi automatici dei tuoi post mentre scrivi

 

 

Molto importante prima di aggornare la vostra versione di WordPress è importante fare un backup del db

Oppure una copia dell'intero sito tramite il plugin Duplicator come potrai vedere dal sito ufficiale e dal video sotto, con molta facilità clona tutto il tuo sito Wordpress, lasciando invariate tutte le impostazioni dei widget, ciò rende molto veloce testare e verificare la nuova versione direttamente in locale.

Considerando che Wordpress e si un CMS fantastico per le sue molteplicì funzionalità e anche molto semplice che qualche plugin vada in conflitto ho peggio nostri script.

Qindi sempre meglio Test su Test in locale ;-)

Rimuovere formattazione automatica di wordpress

undefined

Togliere codice html generato dagli shortcode di Wordpress

Quando andiamo a generare delle pagine custom come la home page spesso a causa della formattazione automatica di wordpress, il codice html generato dagli shortcode nel frontend viene fastidiosamente annidato nei paragrafi e negli accapi, <p>, <br/> questo, oltre ad invalidare il codice html della pagina spesso causa degli errori di visualizzazione gravi!

Un ottimo rimedio è rimuovere il filtro wpautop dalla funzione the_content() che si occupa di stampare il contenuto principale delle pagine e dei post di WordPress.

Inserire dentro il file functions.php

remove_filter('the_content', 'wpautop');//elimina la formattazione automatica

Senza il filtro wpauto, viene disabilitata del tutto la formattazione automatica del testo, impedendo a WordPress l’aggiunta <p>, <br/>
in corrispondenza delle interruzioni di riga così come erano stati disposti nell’editor visuale.

 

htaccess vs web scanners

undefined

Sicurezza via .htaccess contro web scanner Wpscan

La sicurezza nel web non è mai abbastanza, sopratutto se abbiamo la tendenza di usare CMS gratuiti e di largo uso come Wordpress, Joomla, Drupal e altri ancora.

Prendiamo in considerazione come esempio WPScan web scanner dedicato creato per analizzare e cercare falle di sicurezza all'interno della piattaforma di blogging WordPress.

Premesso che le strade dell' hacking sono infinite nulla è veramente a prova di mal intenzionati, possiamo però provare a rendere più sicuri o almeno rendere più impegnativa l'intrusione.

Aggiungendo queste righe all'interno del nostro file .htaccess faremo in modo di dirottare una serie di web scanner w3af.sourceforge.net, dirbuster, nikto, wpscan...

RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} ^w3af.sourceforge.net [NC,OR]
RewriteCond %{HTTP_USER_AGENT} dirbuster [NC,OR]
RewriteCond %{HTTP_USER_AGENT} nikto [NC,OR]
RewriteCond %{HTTP_USER_AGENT} wpscan [NC,OR]
RewriteCond %{HTTP_USER_AGENT} SF [OR]
RewriteCond %{HTTP_USER_AGENT} sqlmap [NC,OR]
RewriteCond %{HTTP_USER_AGENT} fimap [NC,OR]
RewriteCond %{HTTP_USER_AGENT} nessus [NC,OR]
RewriteCond %{HTTP_USER_AGENT} whatweb [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Openvas [NC,OR]
RewriteCond %{HTTP_USER_AGENT} jbrofuzz [NC,OR]
RewriteCond %{HTTP_USER_AGENT} libwhisker [NC,OR]
RewriteCond %{HTTP_USER_AGENT} webshag [NC,OR]
RewriteCond %{HTTP:Acunetix-Product} ^WVS
RewriteRule ^.* http://127.0.0.1/ [R=301,L]

attraverso un redirect a questo link http://127.0.0.1/ (a vostra scelta) ...Nella speranza che questo basti ;-)

 

Salva

Ottimizzazione e riparazione del db di WordPress

undefined

Riparazione e Ottimizazione del db azione nativa di WordPress

Nel corso del nostro lavoro di sviluppo in piattafirma WP, magari nella costruzione di un template implementando nuove funzionalità potrebbe succedere di sporcare il nostro db.

Per ottimizzare o riparare in casi estremi il nostro db WordPress ci mette a disposizione una funzione nativa.
Prima di tutto, eseguire un backup del db di WordPress

Digitando l’indirizzo www.miosito.it/wp-admin/maint/repair.php,  ti si aprirà la pagina che segue:

undefined

modificando il file della configurazione di WordPress, wp-config.php, inserendo questa istruzione:

define('WP_ALLOW_REPAIR', true);

Questa istruzione abilita gli strumenti di riparazione e ottimizzazione del database,
IMPORTANTE Devi ricordati di toglierla (o commentarla per disattivarla) una volta terminato.

 

Salva

Impostare AutoComplete off in Contact Form 7

AutoComplete off

Impostare AutoComplete off in Contact Form 7 di WordPress

L'attributo autocomplete ha due stati logici: on ed off rispettivamente per essere attivato o disattivato, per default è già attivo. Serve per riutilizzare i dati già inseriti su form precedenti, se infatti provate ad inserire il dato, vi viene proposto quanto già inserito precedentemente. Con autocomplete off è possibile disattivarlo e diventa utile in quei campi che per ragioni di privacy e/o di sicurezza non devono essere mostrati dati soltanto perchè già utilizzati in precedenza.

Si applica ai vari tipi di input type ma è possibile applicarlo anche all'intero modulo se dichiarato nell'elemento principale del form

Se abbiamo l'esigenza di inserirlo all'interno del nostro Contact Form 7 di Wordpress, possiamo inserire questo script subito dopo il form

Script:

jQuery(document).ready(function($){
 $('.wpcf7-form').attr('autocomplete', 'off').attr('autosuggest', 'off');
   });

Salva

Nascondere la versione di WordPress

undefined

Nascondere la versione di WordPress sia nei css, js e nel meta generator

Una delle cose più pratiche è nascondere la propia versione di wordpress, per aumentare l'invisibilità al software wpscan ed evitare bug di sistema nelle versioni meno recenti.
Questo rende solo meno evidente la versione che si usa, ma almeno ci rende consapevoli di eventuali rischi.



Rimuovere solo il tag meta generator

Per rimuovere il tag generator, è sufficiente aprire il file functions.php del proprio tema e aggiungere la seguente istruzione.

remove_action('wp_head', 'wp_generator');

Nascondere la versione di WordPress nei feed

Per rimuovere la versione di WordPress sia dalle pagine sia dai feed inserire nel file functions.php del proprio tema il seguente filtro.

function no_generator() { return ''; }
add_filter( 'the_generator', 'no_generator' );

Nascondere la versione di WordPress nei file css e js

Per eliminare la versione dai file js e css inserire i seguenti filtri nel file functions.php.

function remove_css_js_ver( $src ) {
  if( strpos( $src, '?ver=' ) )
  $src = remove_query_arg( 'ver', $src );
  return $src;
}
add_filter( 'style_loader_src', 'remove_css_js_ver', 9999 );
add_filter( 'script_loader_src', 'remove_css_js_ver', 9999 );

Testando il tutto con wpscan... Ancora riesce a vedere la mia versione wp! :-( [ identified form advanced fingerprinting ]

Risolviamo il problema aggiungendo questo script sempre nel function.php

function wp_hide_version() {
return '';
}
add_filter('the_generator', 'wp_hide_version ');

Ritestiamo tutto con wpscan, ora la versione di WordPress non è visibile ;-) [WordPress version can not be detected]

Salva

WordPress con P3 Plugin Performance Profiler

undefined

P3 Plugin Performace Profiler

Questo plugin serve a monitorare l’impatto dei vari plugin installati sul tuo sito sulla performance di quest’ultimo.
P3 Plugin Perfomance Profiler effettua uno scan e genera un report dettagliato delle risorse utilizzate da ciascun plugin;
sviluppato da GoDaddy, uno dei siti più famosi al mondo dove acquistare domini e piani di hosting.

Attivi il plugin P3 Plugin Performance Profiler dalla tua Bacheca, lo strumento è pronto a lavorare.
Per trovare le opzioni disponibili, naviga in Strumenti (Tools, se usi WordPress in inglese) e trova la voce “P3 Plugin Profiler”.
Puoi subito fare uno scan cliccando “Start Scan”.

Strumento potente per evitare e controllare il tuo sistema Wordpress.

Yoast plugin Bug

Yoast SEO bug

Piccolo bug ma molto fastidioso; nell'ultima versione di Yoast SEO, indiscusso plugin di WordPress 4.4.2.
Yoast SEO nella nuovissima versione ha introdotto:

<meta name=”robots” content=”noodp” >
 

Questo nuodo meta tag e un ottimo strumento per la seo, ma in qualche caso, (il mio) non opportuno...
Per la disattivazione manuale:
Cercare all'interno la cartella del plugin il file class-frontend.php
Nella linea l 1892 del file modificate questo codice:

private function add_robot_content_noodp( $description ) { if ( ! ( empty( $description ) ) && $this->options['noodp'] === false ) { $this->options['noodp'] = true; } }

e inserite questo:

private function add_robot_content_noodp( $description ) { if ( ! ( empty( $description ) ) && $this->options['noodp'] === false ) { $this->options['noodp'] = false; } }

Cosi facendo abbiamo disattivato il meta tag in questione.

CSS winner Andres Hunger
CSSRELL Andres Hunger
BESTcss Andres Hunger