Introduzione a Post type e Taxonomy in wordpress

Dal rilascio di WordPress 3.0 sono stati introdotti Post-Type e Taxonomy.
Il Post-Type permette di organizzare meglio i contenuti e di costruire dashboard di amministrazione maggiormente customizzate per il tipo di sito che si sta sviluppando.

Ci sono alcuni punti fondamentali da ricordare quando si lavora con i Post-Type:
1. Quando viene creato un nuovo Post-Type, nella barra di navigazioni dell’area di amministrazione di wordpress apparirà un nuovo elemento di navigazione;
2. L’URL della pagina del post-type : http://yoursite.com/{post-type-slug}/{title}/. Per consentire la visualizzazione di questa pagina deve essere duplicata la pagina single.php e rinominata single-{post-type}.php
3. Per creare la pagina di archivio del post-type creato si può duplicare il file archive.php rinominandolo archive-{post-type}.php.
Ricordarsi alla fine di aggiornare la struttura dei permalink (impostazioni / permalink) facendo un “save” nella pagina di amministrazione.

Da mettere nella function.php per creare il Post-Type “sustcruise_news” (è quello che verrà scritto nella tabella wp_posts di wordpress, colonna post_type)

function create_post_type() {
	//http://codex.wordpress.org/Function_Reference/register_post_type
	register_post_type( 'sustcruise_news',   //massimo 20 caratteri
        array(
            'labels' => array(
                'name' => __( 'News' ),
                'singular_name' => __( 'News' )
            ),
        'public' => true,
        'menu_position' => 5,
        'has_archive' => true, //abilita l'archivio archive-{post-type}.php
        'rewrite' => array('slug' => 'news')
        )
    );  

}
add_action( 'init', 'create_post_type' );

attenzione: con post-type-slug intendo “news”, con post-type “sustcriuse_news”.

Fonte 01
Fonte 02

Continua…

Copiare una riga di una tabella MySql con php

In questo articolo “MySQL Copy Row”, viene mostrata una funzione che permette di duplicare una riga di un DB MySql indicando in nome della tabella il campo di riferimento e l’id relativo:

// Makes a duplicate of Product number 931 in the table
// 'Products', the Primary Key of which is 'ProductID'.
// All fields are duplicated except the id field, which
// is auto-incremented to the next available value.
function MysqlCopyRow($TableName, $IDFieldName, $IDToDuplicate) {
if ($TableName AND $IDFieldName AND $IDToDuplicate > 0) {
$sql = "SELECT * FROM $TableName WHERE $IDFieldName = $IDToDuplicate";
$result = @mysql_query($sql);
if ($result) {
$sql = "INSERT INTO $TableName SET ";
$row = mysql_fetch_array($result);
$RowKeys = array_keys($row);
$RowValues = array_values($row);
for ($i=3;$i<count($RowKeys);$i+=2) {
if ($i!=3) { $sql .= ", "; }
$sql .= $RowKeys[$i] . " = '" . $RowValues[$i] . "'";
}
$result = @mysql_query($sql);
}
}
}

$ProductID = 931; //The id of the product you want to copy
MysqlCopyRow("Products","ProductID",$ProductID);

L’ho usato per la newsletter di Cofferati.

Redirect via .htacces dal vecchio sito al nuovo e altri “htaccess trick”

Nello spazio del vecchio sito è necessario scrivere la seguente regola, redirigendo tutto il traffico che arriva sul nuovo dominio, mantenendo inalterate le url (utile nel caso di trasferimento del dominio da .it a .com mantenendo la struttura del sito, ad esempio)

RewriteEngine On
RewriteRule ^(.*)$ http://www.nuovo-sito.net/$1 [R=301,L]

Si può fare anche un redirect puntuale pagina per pagina

Redirect 301 /en_index.html http://www.nuovosito.net/eng/
Redirect 301 /it_index.html http://www.nuovosito.net/ita/
Redirect 301 /home.html http://www.nuovosito.net/ita/

Oppure si può redirigere tutto il traffico che arriva su un dominio, sulla home di un altro dominio: il dominio in cui risiede questo file manda a www.miodominio.org indipendentemente da qual sia la URL ricercata.

RewriteEngine On
RewriteRule ^(.*)$ http://www.miodominio.org/ [R=301,L]

Redirect di tutto il traffico che arriva su un dominio su una pagina, utile per “Under Costruction” o account sospesi

RewriteEngine On
RewriteBase /folder/
RewriteCond %{REMOTE_HOST} !^1\.1\.1\.1
RewriteCond %{REQUEST_URI} !/under_construction\.html$
RewriteRule .* /under_construction.html [R=302,L]

Proteggere il download, pur conoscendo il percorso dei files

Come evitare il download diretto di files. Spesso si realizzano aree protette da password per consentire il download di files, lasciando però libero l’accesso al file da scaricare con la conseguenza che conoscendone il percorso esatto può essere scaricato senza bisogno di alcun login.

Se vogliamo un livello di sicurezza maggiore conviene usare un sistema un po’ più complicato:
1. lato server con un file .htaccess (server Apache) inserito in una cartella non consentire il download di files in un quella directory

<Files ~ ".+">
Order allow,deny
Deny from all
Satisfy All
</Files>

2. accedere al download attraverso un file (ad esempio download_protect.php) in cui viene chiamata questa funzione (postata su www.php.net):

function dl_file($file){
    //First, see if the file exists
    if (!is_file($file)) { die("<b>404 File not found!</b>"); }

    //Gather relevent info about file
    $len = filesize($file);
    $filename = basename($file);
    $file_extension = strtolower(substr(strrchr($filename,"."),1));

    //This will set the Content-Type to the appropriate setting for the file
    switch( $file_extension ) {
      case "pdf": $ctype="application/pdf"; break;
      case "exe": $ctype="application/octet-stream"; break;
      case "zip": $ctype="application/zip"; break;
      case "doc": $ctype="application/msword"; break;
      case "xls": $ctype="application/vnd.ms-excel"; break;
      case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
      case "gif": $ctype="image/gif"; break;
      case "png": $ctype="image/png"; break;
      case "jpeg":
      case "jpg": $ctype="image/jpg"; break;
      case "mp3": $ctype="audio/mpeg"; break;
      case "wav": $ctype="audio/x-wav"; break;
      case "mpeg":
      case "mpg":
      case "mpe": $ctype="video/mpeg"; break;
      case "mov": $ctype="video/quicktime"; break;
      case "avi": $ctype="video/x-msvideo"; break;

      //The following are for extensions that shouldn't be downloaded (sensitive stuff, like php files)
      case "php":
      case "htm":
      case "html":
      case "txt": die("<b>Cannot be used for ". $file_extension ." files!</b>"); break;

      default: $ctype="application/force-download";
    }

    //Begin writing headers
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: public");
    header("Content-Description: File Transfer");

    //Use the switch-generated Content-Type
    header("Content-Type: $ctype");

    //Force the download
    $header="Content-Disposition: attachment; filename=".$filename.";";
    header($header );
    header("Content-Transfer-Encoding: binary");
    header("Content-Length: ".$len);
    @readfile($file);
    exit;
}

Questo è un esempio base: se immaginiamo di disporre di un DB probabilmente avremmo un’interrogazione di questo tipo download_protect.php?fileid=256 e prima di consentire il download verificheremo se l’utente che sta richiedento il download ha il permesso di scaricare il file con id 256.
Approfondirò la cosa per mioreferto.it

Centrare un layout sulla pagina

Per centrare un blocco/div al centro della pagina (orizzontalmente), è sufficiente impostare una larghezza al div e impostare i margini destro e sinisto auto.
Questo è il modo più veloce-semplice-diffuso per allineare al centro il contenuto/layout di una pagina.

body {
text-align:center
}
.contenitore {
margin-left:auto;
margin-right:auto;
width:980px;
text-align:left;
}

text-align:center sul body e text-align:left sul .contenitore sono oggi superflui, servono a superare un bug di versioni obsolete di explorer

WordPress Multilingua

Per far diventare un’installazione di WordPress multilingua i due plug-in più diffusi sono qTranslate e WPML – The WordPress Multilingual Plugin: il primo gratuito il secondo da 29 a 79$ a seconda delle versioni.
qTranslate dopo l’installazione permette di selezionare le lingue in cui il sito deve essere disponibile e lato backend vengono visualizzati dei TAB per l’inserimento delle versioni in lingua degli articoli e delle pagine. Nel DB nello stesso record viene scritto l’articolo nelle due lingue delimitando con dei commenti html appositi le versioni. E’ possibile inoltre pubblicare articoli solo in certe lingue.
Il limite di qTranslate sta nell’url rewiting: è possibile scegliere tra diverse modalità di visualizzazione delle url
Modalità Query (?lang=it)
Modalità Pre-Path (Default, inserisce /it/ all’inizio dell’URL)
Modalità Pre-Domain (usa http://it.tuosito.com)
ma qualunque sia la scelta l’url sarà lo stesso sia per l’italiano che per l’inglese (salvo la sigla “en”).
Scrivere URL differenti per lo stesso articolo a seconda della lingua è possibile invece su WPML.
Esite tuttavia un plugin qTranslate slug with widget che consente anche con qTranslate la riscrittura dell’URL in maniera differente a seconda della lingua ottenento un risultato ottimale:
/it/articolo-italiano/
/en/english-post/
Credo che userò la soluzione “qTranslate/qTranslate slug with widget” per sustainablecruise.eu.

Chiamata GET jQuery, con risposta Json con gestione dell’errore

La funzione $.getJSON() di jQuery non consente la gestione del’errore. Che succede se va via la connessione mentre l’applicazione mobile è in funzione? Potrebbe succedere che vedremo un loading infinito oppure che l’applicazione si pianti.
Conviene quindi utilizzare una chiamata GET “generica” di jQuery e se la chiamata va a buon fine fare quel che deve essere fatto con il JSON.

Ecco un esempio:

//Suppongo di arrivare in una pagina jQuery mobile
$('#searchResult').live('pageshow', function(event) {
var title = "avatar";
	$.ajax ({
		url: serviceURL + 'cerca-un-film.php?title='+title,
		type: "GET",
		contentType: "application/json; charset=utf-8",
		datatype: "json",

		error: function () {
			alert("Qualcosa non va")
			},//chiudo error

		success: function (data) {
			displayMoviesNP($.parseJSON(data))
			}//chiudo success

	})// chiudo $.ajax
}

Login WordPress da una pagina php che riceve login e password via get o post

Nel caso in cui le informazioni contenute in un wordpress vengano utilizzate per un’applicazione esterna o per un sito esterno può essere utile realizzare una pagina (residente nello stesso dominio del wordpress) che consente il login dell’utente: la pagina riceve username e password via post o get e effettua il login.
Ecco il codice:

require($_SERVER['DOCUMENT_ROOT'] . '/wp-load.php'); 

// The credentials is an array that has 'user_login', 'user_password'
$user_login = $_POST['login']
$user_password = $_POST['password']

$credentials = array(
	  'user_login' => $user_login,
	  'user_password' => $user_password
	);  

$user = wp_signon( $credentials, false); 

if ( is_wp_error($user) ) {
   echo $user->get_error_message(); //login sbagliato
} else {
   echo $user_id = $user->ID; //login riuscito
}

10 jQuery Mobile snippets da conoscere assolutamente

Cominciando a lavorare con jQuery Mobile ci si rende subito conto che alcune cose che sembrano complicate le fa “da solo” senza che sia necessario alcun intervento, mentre altre in teoria più semplici sono “semi-blindate” per cui customizzare comportamenti/grafica standard non è così semplice.

In questo articolo ci sono alcuni suggerimenti per modificare alcuni comportamenti default:
1. disabilitare l’accorciamento del testo nelle liste e nei bottoni
2. Utilizzare un background random ad ogni cambio pagina
3. Disabilitare un bottone
4. Disabilitare popup
5. Creare un tema custom
6. Usare custom font (consiglia di utilizzare @font-face / font Squirrel)
7. Utilizzare un’icona/immagine senza testo
8. Aprire un link senza utilizzare le transizioni AJAX native
9. rimuovere le freccie della una lista
10. Impostare il colore di background di una pagina.