La migliore raccolta di codice per il tuo file 'functions.php'

9 set 2010, 11:29:00
Visualizzazioni: 169K
Voti: 346

Come molti altri che stanno leggendo questo post, ho trascorso del tempo a leggere vari blog, forum e gruppi di discussione per imparare e migliorare le mie competenze WordPress. Negli ultimi 12 mesi mi sono impegnato nella missione di sostituire l'uso dei plugin aggiungendo invece il codice al mio file functions.php.

Sebbene sia completamente d'accordo che i plugin siano molto utili in molte situazioni, la mia esperienza ha dimostrato che nel 90% dei casi, anche se un plugin potrebbe esistere, il suo utilizzo effettivo potrebbe creare complicazioni non necessarie e problemi di compatibilità. Inoltre, in molti casi questi plugin aggiungevano menu e altri elementi amministrativi che non desidero o di cui non ho bisogno.

Molto spesso ho scoperto che analizzando il codice dei plugin sono stato in grado di estrarre la parte di codice che volevo e inserirla direttamente nel mio functions.php. Questo mi ha fornito esattamente la funzionalità di cui avevo bisogno senza dover includere elementi non necessari.

Quindi, lo scopo di questo post è il mio tentativo di coinvolgere voi, lettori/amministratori/sviluppatori, per condividere con me e con altri qui qualsiasi frammento di codice che trovate utile e che avete aggiunto al file functions.php del vostro tema per estendere o migliorare WordPress senza utilizzare un plugin.

Quando inviate una risposta qui, vi prego gentilmente di dare un titolo a ogni frammento di codice, farci sapere con quale versione di WordPress sapete che è compatibile, includere qualsiasi descrizione che ritenete descriva al meglio la sua funzione e (se applicabile) includere un link al plugin originale o alla fonte dove avete trovato l'informazione.

Non vedo l'ora di leggere tutte le vostre risposte e naturalmente continuerò ad aggiungere le mie nuove scoperte ogni volta che le troverò.

Vi preghiamo di votare la domanda e qualsiasi risposta che trovate utile cliccando sulla freccia su sul lato sinistro della domanda o risposta.

25
Commenti

Per favore aggiungi anche i tuoi vecchi risultati esistenti.

hakre hakre
9 set 2010 11:38:16

Ciao @NetConstructor: Sono preoccupato per questa domanda perché è una domanda del tipo "Lista di X" che ci è stato detto di tenere d'occhio dalla comunità di StackExchange: http://meta.stackexchange.com/questions/57226/should-we-have-a-list-of-x-close-reason La mia principale preoccupazione è che quando penso alla tua domanda, riesco a immaginare un numero quasi infinito di risposte e, di conseguenza, temo che questa domanda si traduca in una raccolta di risposte casuali ma nulla di definitivo. Vorrei avere il parere di altri su questo prima di (votare per) chiuderla, però, perché non voglio essere troppo severo, ho solo dei dubbi.

MikeSchinkel MikeSchinkel
9 set 2010 14:00:40

Il mio voto è per chiudere o renderla una wiki della comunità

Chris_O Chris_O
9 set 2010 15:37:41

Considerando che le prime 5 risposte sono state fornite dall'OP e la domanda sembra più orientata a raccogliere una serie di risposte piuttosto che una singola risposta definitiva, questa dovrebbe essere una wiki della community.

EAMann EAMann
9 set 2010 17:43:16

Sembra che non si possa semplicemente modificare una domanda per convertirla in una wiki. È corretto?

NetConstructor.com NetConstructor.com
9 set 2010 18:31:53

Nonostante ciò, questo è utile (ho trovato 2 snippet che utilizzerò molto) se deve diventare una wiki della community e deve essere ricominciato da zero per farlo, forse possiamo semplicemente spostare il materiale qui?

Lemon Bacon Lemon Bacon
10 set 2010 02:58:46

@NetConstructor.com ... Ho convertito la domanda in una wiki quando ho scritto il mio ultimo commento. Scusa se ha causato confusione. Normalmente, tu (come autore originale) puoi trasformare una domanda in wiki in qualsiasi momento.

EAMann EAMann
10 set 2010 03:56:15

@EAMann grazie... stavo cercando quell'opzione ma non ero sicuro di dove fosse posizionata. Forse dopo che l'hai convertita non ho più visto l'opzione?

NetConstructor.com NetConstructor.com
10 set 2010 08:37:41

@NetConstructor.com - Esatto. Una volta convertita, è convertita... l'opzione viene impostata e sparisce dalla pagina.

EAMann EAMann
10 set 2010 17:23:26

Considererei questo uno stile poco elegante e preferirei i plugin. a) Sono sviluppati da sviluppatori dedicati b) sono mantenuti e facilmente aggiornabili. Per piccoli snippet personalizzati consiglio il plugin Shortcode Exec PHP che offre un modo molto pulito - e portabile - per personalizzare il tuo Wordpress.

Raphael Raphael
10 nov 2010 11:43:21

sebbene interessante credo che la maggior parte delle persone concorderebbe sul fatto che quando si sviluppano temi si preferisce avere le cose localizzate all'interno di un file functions.php

NetConstructor.com NetConstructor.com
24 nov 2010 19:01:50

@NetConstructor - Se intendi modificare i post degli altri, per favore fallo con attenzione, hai rovinato l'indentazione nel mio messaggio, mi impegno sempre a mantenere l'indentazione per una migliore leggibilità. Apprezzerei anche se potessi prenderti il tempo per spiegare le modifiche che apporti (non ho visto alcun motivo per modificare il mio post - e non c'era alcun riepilogo delle modifiche).

t31os t31os
28 gen 2011 18:53:26

@t31os -- L'ho modificato per mantenerlo coerente con tutte le altre voci

NetConstructor.com NetConstructor.com
7 feb 2011 15:53:20

Tutte le risposte non correlate a un tema dovrebbero essere rimosse. Questo thread è un buon esempio di cattive pratiche di programmazione.

fuxia fuxia
13 giu 2011 15:09:56

Dovrei dissentire. La domanda non era correlata al tema. Tutte le modifiche al functions.PHP pertinenti sono benvenute e gli utenti dovrebbero votare positivamente/negativamente di conseguenza.

NetConstructor.com NetConstructor.com
14 giu 2011 07:56:23

È interessante notare che non viene menzionato da nessuna parte che il file functions.php è quello nella directory del tuo tema, causando confusione, come in questo caso: http://wordpress.stackexchange.com/questions/25341/error-after-editing-functions-php

scribu scribu
9 ago 2011 03:07:10

Penso che sarebbe meglio incoraggiare le persone a creare un plugin di funzionalità personalizzato invece di usare il functions.php del loro tema

Ian Dunn Ian Dunn
16 gen 2012 20:49:10

@rarst - Riguardo al tuo commento sulla chiusura di questa discussione, non è proprio questo il motivo per cui è elencata nel wiki della community?

User User
19 feb 2012 15:35:19

@Cor van Noorloos l'utilizzo dello status di wiki community è stato notevolmente ridotto e scoraggiato dalla rete. In poche parole, la scusa "non è proprio adatto per Q&A, ma è una wiki community!" non è più accettabile. Le risposte qui sono diventate un insieme disordinato e mal mantenuto, visitato solo per il fattore wow/divertimento. C'è stato molto movimento in tutta la rete per eliminare domande come questa.

Rarst Rarst
19 feb 2012 15:43:03

@rarst - Comprensibile. Punto preso.

User User
19 feb 2012 15:55:04

Per quanto riguarda la chiusura di questa specifica "wiki", voto per la sua riapertura. Ovviamente questo post wiki è molto popolare, come dimostrato dal fatto che ha 30.000 visualizzazioni, tre volte il numero di QUALSIASI altra domanda o wiki su questo sito, e l'argomento stesso è stato votato positivamente 119 volte, il doppio rispetto a qualsiasi altra domanda o argomento. Se sei d'accordo sul suo valore, vota per la riapertura cliccando sul link "riapri".

NetConstructor.com NetConstructor.com
20 feb 2012 13:12:40

@NetConstructor.com Il puro numero di visualizzazioni di pagina non è un indicatore di qualità. Dovremmo incoraggiare domande specifiche con risposte specifiche e buone pratiche di programmazione. Questa discussione è l'opposto.

fuxia fuxia
22 feb 2012 04:44:30

@toscho - questo è esattamente il motivo per cui è stato impostato come wiki e quindi questo post è perfettamente valido. Il punto che ho sollevato riguardo alle visualizzazioni di pagina è stato menzionato perché questo argomento è ovviamente 3 volte più popolare di qualsiasi altro su questo sito. Questo sito è popolare proprio grazie a domande come queste e quindi non ha senso chiuderlo. Non credo si possa discutere su questo a meno che l'interesse della comunità per argomenti come questi non abbia valore per gli amministratori.

NetConstructor.com NetConstructor.com
24 feb 2012 18:38:34

Aggiungerò un altro commento qui basandomi su alcuni calcoli che ho appena fatto. Ci sono meno di 790 utenti registrati su questo sito con un rating di "1" o superiore. Assumendo che questo gruppo di individui rappresenti coloro che effettivamente votano e/o contribuiscono al sito (e 790 è una stima incredibilmente equa), allora 117 persone che hanno votato positivamente questa domanda rappresentano oltre il 14% di tutti gli utenti attivi che hanno trovato utile questo argomento. Per favore, votate per riaprire la discussione.

NetConstructor.com NetConstructor.com
24 feb 2012 18:47:01

@NetConstructor.com Discutine su Meta dove le persone possono comprendere meglio i tuoi argomenti. :)

fuxia fuxia
24 feb 2012 19:10:14
Mostra i restanti 20 commenti
Tutte le risposte alla domanda 30
3

Precompilazione dei tipi di post

Ecco un esempio per questa raccolta.

////////////////////////////////////////////////////////////////////////////////////
// Questo codice precompila automaticamente i tipi di post e i post.
///////////////////////////////////////////////////////////////////////////////////

add_filter( 'default_content', 'my_editor_content' );

function my_editor_content( $content ) {

    global $post_type;

    switch( $post_type ) {
        case 'your_post_type_here': // precompilazione automatica
            $content = 'Il contenuto con cui vuoi precompilare il tipo di post.';
break;
     }

    return $content;
}

Può essere utile quando devi pubblicare le stesse informazioni più volte con piccole differenze.

11 nov 2011 00:36:58
Commenti

Ottimo lavoro! Mi piace questa opzione semplice. Puoi espanderla mostrando possibili modi per popolare automaticamente i campi personalizzati o altri criteri/opzioni o magari anche i mezzi per inserire automaticamente i media?

NetConstructor.com NetConstructor.com
12 nov 2011 01:09:08

Posso sicuramente valutare di espanderla. Non ho ancora provato ad andare oltre per ora.

Nicole Nicole
14 nov 2011 16:31:44

Mi piacerebbe vedere modi per espandere questa funzionalità

JasonDavis JasonDavis
11 apr 2012 12:09:47
2

Includi Automaticamente il Codice Google Analytics

Testato su: WordPress 3.1 RC3

Utilizzo questo script su tutti i miei siti da WordPress 2.3.0... aggiunge semplicemente i codici standard di tracciamento di Google nel footer.

// Aggiungi il Codice di Tracciamento Google Analytics
function add_google_analytics() {
?>
<script type="text/javascript">
    var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
    document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
    try {
        var pageTracker = _gat._getTracker("UA-XXXXXXX-X");
        pageTracker._trackPageview();
    } catch(err) {}</script>
<?php
}

add_action('wp_footer', 'add_google_analytics');

Assicurati di sostituire UA-XXXXXXX-X con il tuo codice di tracciamento Google...

15 set 2010 18:48:47
Commenti

grazie per la condivisione. Anche io ho utilizzato questo metodo, ma sarei curioso di sapere se sei a conoscenza di come possa essere modificato per far sì che specifici tag, pagine di tipi di post o persino i post stessi possano ricevere automaticamente valori aggiuntivi sfruttando le funzionalità delle variabili di tracciamento campagne che Google offre. Inoltre, cosa bisognerebbe aggiungere se volessimo includerlo nel footer di tutte le pagine di amministrazione per tracciare l'attività degli admin?

NetConstructor.com NetConstructor.com
17 set 2010 09:53:19

Non sono sicuro riguardo all'aggiunta di variabili di tracciamento campagne solo perché non ne ho avuto bisogno finora. Ma per aggiungere gli stessi script alle pagine di amministrazione, basterebbe usare add_action('admin_footer', 'add_google_analytics'); per agganciarsi al footer delle pagine di amministrazione.

EAMann EAMann
17 set 2010 16:08:27
0

Elenca tutte le costanti per informazioni e debug

Testato su: Wordpress 3.0.1

Mostrerà le informazioni solo se sei un utente loggato

if ( is_user_logged_in() ) {
    print('<pre>');
    print_r( @get_defined_constants() );
    print('</pre>');
}

Ecco la versione con filtro opzionale che corrisponderà parzialmente ai nomi e valori delle costanti:

function constants($filter = false) {

        $constants = get_defined_constants();

        if( $filter ) {

            $temp = array();

            foreach ( $constants as $key => $constant )
                if( false !== stripos( $key, $filter ) || false !== stripos( $constant, $filter ) )
                    $temp[$key] = $constant;

            $constants = $temp;
        }

        ksort( $constants );
        var_dump( $constants );
    }
17 set 2010 11:32:12
2

Aggiungi l'aggiornamento automatico/installazione plugin sul tuo localhost

define ('FS_METHOD', 'direct'); // Imposta il metodo di accesso al filesystem come diretto

Inserisci questo nel tuo file wp-config.php.

5 nov 2010 17:19:07
Commenti

quindi questo aggiorna automaticamente qualsiasi/i tuoi plugin quando è disponibile qualcosa di nuovo?

NetConstructor.com NetConstructor.com
5 nov 2010 17:44:26

No, semplicemente non hai bisogno di un login ftp per aggiornare il core o i plugin localmente

Horttcore Horttcore
9 nov 2010 10:11:20
3

Modifica lo Slug Predefinito dell'Autore

Aggiungi questo nel tuo file functions.php per cambiare lo slug predefinito dell'autore con quello che preferisci.
Basta sostituire "sellers" con lo slug che desideri utilizzare.

// Cambia lo Slug dell'URL da Author a Sellers
function new_author_base() {
    global $wp_rewrite;
    $author_slug = 'sellers';
    $wp_rewrite->author_base = $author_slug;
}
add_action('init', 'new_author_base');
21 dic 2010 22:19:20
Commenti

Non vorresti eseguire quel codice ad ogni caricamento della pagina però.

t31os t31os
21 dic 2010 22:27:01

Già, svuotare i ruoli ad ogni caricamento ti fa risparmiare un sacco di venditori. :) Meglio usare il plugin Edit Author Slug.

fuxia fuxia
22 dic 2010 05:21:51

Ho aggiornato la funzione!!! Grazie per il tuo contributo:)

Philip Philip
12 gen 2011 23:37:33
0

Aggiungi il pulsante "Pagina successiva" nell'editor WYSIWYG

add_filter('mce_buttons','wysiwyg_editor');
function wysiwyg_editor($mce_buttons) {
    $pos = array_search('wp_more',$mce_buttons,true);
    if ($pos !== false) {
        $tmp_buttons = array_slice($mce_buttons, 0, $pos+1);
        $tmp_buttons[] = 'wp_page';
        $mce_buttons = array_merge($tmp_buttons, array_slice($mce_buttons, $pos+1));
    }
    return $mce_buttons;
}
2 gen 2011 22:13:51
3

Aggiungi stili personalizzati all'editor TinyMCE

A volte gli utenti e i clienti si confondono su come il loro contenuto viene visualizzato nell'editor rispetto a come viene mostrato sul front-end. Copiare solo poche righe rilevanti dal tuo foglio di stile principale nel nuovo tinymce.css può aiutare molto:

function custom_mce_css($wp) {
    return $wp .= ',' . get_bloginfo('stylesheet_directory') . '/css/tinymce.css';
}
add_filter( 'mce_css', 'custom_mce_css' );
4 gen 2011 19:02:27
Commenti

Bello. Ho appena scoperto che esiste una soluzione di Seamus Leahy che estende tutto questo ulteriormente aggiungendo una classe body a tinymce. http://www.digwp.com/2010/11/actual-wysiwyg

Michal Mau Michal Mau
20 gen 2011 04:03:48

Non è già coperto dal core e dagli stili dell'editor?

kaiser kaiser
1 feb 2011 09:52:16

Preferisco creare un foglio di stile sia per il front-end che per TinyMCE in un colpo solo. Poi uso la funzionalità core della funzione add_editor_style() per includere il foglio di stile e assicurarmi che venga caricato quando si carica TinyMCE. Articolo del Codex su http://codex.wordpress.org/Function_Reference/add_editor_style

Philip Downer Philip Downer
13 set 2011 23:42:36
2

Ridimensiona immagini grandi durante il caricamento

L'immagine verrà ridimensionata in base alla dimensione grande nelle impostazioni dei media.

/** Ridimensiona al caricamento secondo la dimensione più grande nelle impostazioni media */


function replace_uploaded_image($image_data) {
// se non esiste un'immagine grande: restituisci
if (!isset($image_data['sizes']['large'])) return $image_data;

// percorso dell'immagine caricata e dell'immagine grande
$upload_dir = wp_upload_dir();
$uploaded_image_location = $upload_dir['basedir'] . '/' .$image_data['file'];
$large_image_location = $upload_dir['path'] . '/'.$image_data['sizes']['large']['file'];

// elimina l'immagine caricata
unlink($uploaded_image_location);

// rinomina l'immagine grande
rename($large_image_location,$uploaded_image_location);

// aggiorna i metadati dell'immagine e restituiscili
$image_data['width'] = $image_data['sizes']['large']['width'];
$image_data['height'] = $image_data['sizes']['large']['height'];
unset($image_data['sizes']['large']);

return $image_data;
}
add_filter('wp_generate_attachment_metadata','replace_uploaded_image');
11 feb 2011 00:10:00
Commenti

Significa che il file originale di grandi dimensioni caricato viene effettivamente sostituito? Il mio PHP non è eccezionale, ma la risposta sembrerebbe essere sì?

davemac davemac
20 feb 2011 03:26:33

@davemac Mi rendo conto che è molto vecchio ormai, ma da quello che ho capito del codice, il file immagine originale viene ridimensionato alle stesse dimensioni dell'immagine 'grande' impostata nella schermata delle impostazioni di WordPress. Il che è ottimo, ma poi ti ritrovi semplicemente con 2 immagini della stessa dimensione. Suggerirei di impostare manualmente i valori per rendere l'immagine originale grande solo quanto il file più grande che utilizzerai realisticamente sul tuo sito. In questo modo avrai un'immagine quasi originale con cui lavorare in futuro.

Phill Healey Phill Healey
25 nov 2016 21:22:33
0

Utilizzare figure e figcaption per le didascalie

Testato su: WordPress 3.1.3

(Crediti a WP Engineer: http://wpengineer.com/917/filter-caption-shortcode-in-wordpress/)

function mytheme_caption( $attr, $content = null ) {
    $output = apply_filters( 'img_caption_shortcode', '', $attr, $content );
    if ( $output != '' )
        return $output;

    extract( shortcode_atts ( array(
    'id' => '',
    'align' => 'alignnone',
    'width'=> '',
    'caption' => ''
    ), $attr ) );

    if ( 1 > (int) $width || empty( $caption ) )
        return $content;

    if ( $id ) $id = 'id="' . $id . '" ';

    return '<figure ' . $id . 'class="wp-caption ' . $align . '" style="width: ' . $width . 'px">'
. do_shortcode( $content ) . '<figcaption class="wp-caption-text">' . $caption . '</figcaption></figure>';
}

add_shortcode( 'wp_caption', 'mytheme_caption' );
add_shortcode( 'caption', 'mytheme_caption' );
8 giu 2011 11:22:16
0

Ecco alcuni utili shortcode che puoi utilizzare:


1. Shortcode facile per aggiungere pulsanti di condivisione su Twitter e Facebook

function shreplz() {
   return '
    <div class="sharebox">
    <div class="twittme"><a href="https://twitter.com/share" class="twitter-share-button" data-count="horizontal">Tweet</a><script type="text/javascript" src="//platform.twitter.com/widgets.js"></script></div>
    <div class="shareface"><a name="fb_share"></a> <script src="http://static.ak.fbcdn.net/connect.php/js/FB.Share" type="text/javascript"></script></div>
    <br style="clear: left;" />
    </div>
   ';
}
add_shortcode('sharethis', 'shreplz');
// Come usare: [sharethis]

2. Shortcode semplice per catturare un'istantanea remota utilizzando l'API di WordPress

function wpr_snap($atts, $content = null) {
        extract(shortcode_atts(array(
            "snap" => 'http://s.wordpress.com/mshots/v1/',
            "url" => 'http://www.sagive.co.il',
            "alt" => 'La mia immagine',
            "w" => '400', // larghezza
            "h" => '300' // altezza
        ), $atts));

    $img = '<img src="' . $snap . '' . urlencode($url) . '?w=' . $w . '&h=' . $h . '" alt="' . $alt . '"/>';
        return $img;
}

add_shortcode("snap", "wpr_snap");
// Come usare: [snap url="http://www.example.com" alt="Sito Fantastico!" w="300px" h="200px"]

3. Shortcode facile per incorporare un iFrame

function GenerateIframe( $atts ) {
    extract( shortcode_atts( array(
        'href' => 'http://the-url',
        'height' => '550px',
        'width' => '600px',
    ), $atts ) );

    return '<iframe src="'.$href.'" width="'.$width.'" height="'.$height.'"> <p>Il tuo browser non supporta gli Iframe.</p></iframe>';
}
add_shortcode('iframe', 'GenerateIframe');
// Come usare: [iframe href="http://www.exmaple.com" height="480" width="640"]

4. Shortcode per includere facilmente un file/documento remoto

function getfile_content( $atts ) {
  extract( shortcode_atts( array(
    'fileurl' => ''
  ), $atts ) );

  if ($fileurl!='')
    return @file_get_contents($fileurl);
}

add_shortcode( 'getfile', 'getfile_content' );
// Come usare: [getfile fileurl="http://www.exmaple.com/somepage.html"]

. Ecco alcuni snippet relativi ai commenti:

1. Disabilita globalmente la possibilità di commentare

function closeCommentsGlobaly($data) { return false; }
add_filter('comments_number', 'closeCommentsGlobaly');
add_filter('comments_open', 'closeCommentsGlobaly');

2. Assegna una classe CSS diversa ai commenti dell'amministratore

if (1 == $comment->user_id)
    echo 'siteadmin'; // Scegli qui la tua classe

3. Una lista commenti ricca di dati - ottima per pagine personalizzate

$comments = get_comments( array(
    'number'    => 10, // Numero di commenti
    'status'    => 'approve' // Tipo di commenti
) );

foreach($comments as $eachComment){

    // Raccoglie i dati e li assegna
    $commentID = comment_ID;
    $commentAuthorEmail = $eachComment->comment_author_email;
    $commentPostId = $eachComment->comment_post_ID;
    $commentPostTitle = get_the_title( $commentPostId );
    $commentPostUrl = get_permalink( $commentPostId );
    $comment_sidebarnumber = get_comments_number( $commentPostId );

    global $wpdb;
    $userCommentCount = $wpdb->get_var('SELECT COUNT('.$commentID.') FROM ' . $wpdb->comments. ' WHERE comment_author_email = "' . $commentAuthorEmail . '"');

    echo '<div style="border: 1px solid #ccc; padding: 10px;">';
    echo '<ul style="margin: 0px;">';
    echo '<li>Nome: '. $eachComment->comment_author .'</li>';
    echo '<li>Ha commentato su: <a href="'.$commentPostUrl.'">'. $commentPostTitle .'</a></li>';
    echo '<li>Data del commento: '. $eachComment->comment_date .'</li>';
    echo '<li>Sito del commentatore: '. $eachComment->comment_author_email .'</</li>';
    echo '<li>Email del commentatore: '. $eachComment->comment_author_email .'</</li>';
    echo '<li>Questo commentatore '. $eachComment->comment_author .' ha commentato '. $userCommentCount .' volte sul tuo sito</</li>';
    echo '</ul>';
    echo '<p style="padding: 10px;"><strong>'. $eachComment->comment_author .' ha scritto</strong>: '. $eachComment->comment_content .'</p>';
    echo '</div>';
}
9 gen 2012 01:50:17
1

Condizionale per verificare i discendenti nella gerarchia

Una funzione condizionale per verificare se la pagina corrente è un discendente dell'ID fornito. Utile per determinare se una pagina è un nipote, pronipote o più in basso nell'albero gerarchico.

function is_tree($pid) {      // $pid = L'ID della pagina che stiamo cercando nelle pagine sottostanti
    global $post;         // carica i dettagli su questa pagina

    $anc = get_post_ancestors( $post->ID );
    foreach($anc as $ancestor) {
        if(is_page() && $ancestor == $pid) {
            return true;
        }
    }
    if(is_page()&&(is_page($pid))) 
               return true;   // siamo nella pagina o in una sottopagina
    else 
               return false;  // siamo altrove
};
3 dic 2010 01:07:15
Commenti

Stavo cercando questa soluzione da un po'. Grazie per averla messa insieme! Posso chiedere un po' di chiarimenti sul caso d'uso. Idealmente, vorrei usarla nei miei menu in modo che se ho un menu principale genitore nella parte superiore del sito che mostra solo elementi di prima generazione. Quando mi trovo su un elemento di seconda o terza generazione, l'elemento di prima generazione possa essere evidenziato tramite un attributo CSS "current-parent". È possibile fare questo?

Scott B Scott B
11 feb 2011 07:48:19
1

Crea un tag condizionale per tassonomie personalizzate

In questo esempio, 'student' era un tipo di post personalizzato e 'stud_cat' era la tassonomia personalizzata. Usa has_student(null) per la condizione

    function has_student( $student, $_post = null ) {
    if ( !empty( $student ) )
        return false;
    if ( $_post )
        $_post = get_post( $_post );
    else
        $_post =& $GLOBALS['post'];
    if ( !$_post )
        return false;
    $r = is_object_in_term( $_post->ID, 'studcat', $student );
    if ( is_wp_error( $r ) )
        return false;
    return $r;
}
18 dic 2010 23:46:16
Commenti

Penso che questo venga sostituito con has_term() ora che la versione 3.1 è stata rilasciata?

Rarst Rarst
26 feb 2011 01:32:10
2

Facili correzioni per la sicurezza di WordPress

La sicurezza attraverso l'oscurità è il nome del gioco qui. Queste funzioni fanno tre cose diverse.

  1. Rimuovono la stringa della versione dal codice. Non c'è motivo di dire alla gente quale versione stiamo utilizzando.
  2. Rimuovono i messaggi di errore (Password errata, Utente inesistente, ecc.) dalla schermata di login dell'amministratore
  3. Quando l'amministratore pubblica un commento, viene aggiunta una classe CSS. Questo rimuove il nome dell'amministratore nei commenti.

    //RIMUOVI LA STRINGA DELLA VERSIONE DALL'HEADER
    remove_action('wp_head', 'wp_generator');
    
    //NASCONDI I MESSAGGI DI ERRORE DI LOGIN (Password errata, Utente inesistente ecc.)
    add_filter('login_errors',create_function('$a', "return null;"));
    
    // Rimuovi il nome dell'amministratore nella classe dei commenti
    // Fonte: http://www.wprecipes.com/wordpress-hack-remove-admin-name-in-comments-class
    function remove_comment_author_class( $classes ) {
        foreach( $classes as $key => $class ) {
            if(strstr($class, "comment-author-")) {
                unset( $classes[$key] );
            }
        }
        return $classes;
    }
    add_filter( 'comment_class' , 'remove_comment_author_class' );
    
14 set 2011 20:19:38
Commenti

Rimuovere il numero di versione di WordPress è una cattiva pratica. È molto più sicuro mantenere WordPress sempre aggiornato con gli ultimi fix di sicurezza IN OGNI MOMENTO. Bonus aggiuntivo: gli aspiranti script kiddie si sposteranno su versioni più vecchie.

knutole knutole
12 gen 2014 18:30:59

@knotole, non è una cattiva pratica. È la tua opinione... anche se questo è piuttosto standard.

Jeremy Jeremy
20 ott 2014 23:13:51
0

Sostituisci il Gravatar Predefinito con un'Immagine Personalizzata

Tutto ciò che devi personalizzare è il percorso della tua immagine predefinita.

function custom_gravatar($avatar_defaults) {
    $logo = get_bloginfo('template_directory') . '/images/icons/gravatar_logo.jpg'; //Cambia con il percorso che preferisci.
    $avatar_defaults[$logo] = get_bloginfo('name');
    return $avatar_defaults;
}//FINE FUNZIONE    
add_filter( 'avatar_defaults', 'custom_gravatar' );
14 set 2011 20:21:41
0

Crea automaticamente una nuova pagina all'attivazione di un tema

if (isset($_GET['activated']) && is_admin()){
    $new_page_title = 'Titolo della pagina'; // Titolo della nuova pagina
    $new_page_content = 'Contenuto della pagina'; // Contenuto della nuova pagina
    $new_page_template = ''; //es. template-personalizzato.php. Lasciare vuoto se non si desidera un template personalizzato.

// Non modificare sotto questa linea
$page_check = get_page_by_title($new_page_title);
$new_page = array(
    'post_type' => 'page',
    'post_title' => $new_page_title,
    'post_content' => $new_page_content,
    'post_status' => 'publish',
    'post_author' => 1,
);
if(!isset($page_check->ID)){
    $new_page_id = wp_insert_post($new_page);
    if(!empty($new_page_template)){
        update_post_meta($new_page_id,'_wp_page_template', $new_page_template);
    }
}
4 dic 2011 13:47:31
1

Elenco di tutte le SottoCategorie

Testato su: Wordpress 3.0.1

$echo = '<ul>' . "\n";
$childcats = get_categories('child_of=' . $cat . '&hide_empty=1');
foreach ($childcats as $childcat) {
    if (1 == $childcat->category_parent) {
        $echo .= "\t" . '<li><a href="' . get_category_link($childcat->cat_ID).'" title="' . $childcat->category_description . '">';
        $echo .= $childcat->cat_name . '</a>';
        $echo .= '</li>' . "\n";
    }
}
$echo .= '</ul>' . "\n";
echo $echo;

inoltre, qui trovi maggiori informazioni e funzioni nel post http://wpengineer.com/2025/list-all-subcategories/

17 set 2010 11:35:59
Commenti

Perché faresti questo quando esiste una funzione specifica per visualizzare un elenco di categorie... Vedi: http://codex.wordpress.org/Template_Tags/wp_list_categories#Only_Show_Children_of_a_Category

t31os t31os
11 nov 2010 19:06:10
0

Pulizia Automatica degli Slug SEO senza rimuovere la funzionalità

Testato su: Wordpress 3.0.1

Aggiungendo questo codice al tuo file functions.php, WordPress pulirà automaticamente lo slug/URL del titolo rimuovendo tutte le parole non necessarie. Ho esteso le capacità con personalizzazioni aggiuntive che nascondono anche l'opzione dello slug nelle impostazioni dello schermo e il metabox. Includendo il codice qui sotto, ogni nuovo articolo che creerai avrà automaticamente uno slug abbreviato e manterrai comunque la possibilità di modificarlo manualmente cliccando sull'URL sotto il titolo del post e salvando l'articolo.

// PULISCI AUTOMATICAMENTE GLI SLUG SEO DI PAGINE/ARTICOLI RIMUOVENDO LE PAROLE BREVI
add_filter('name_save_pre', 'seo_slugs', 0);
function seo_slugs($slug) {
    // Non vogliamo modificare uno slug esistente
    if ($slug) return $slug;
    global $wpdb;
    $seo_slug = strtolower(stripslashes($_POST['post_title']));
    $seo_slug = preg_replace('/&.+?;/', '', $seo_slug); // rimuove entità HTML
    // rimuove tutto ciò che non è una lettera, numero, spazio o apostrofo
    $seo_slug = preg_replace ("/[^a-zA-Z0-9 \']/", "", $seo_slug);
    // Converti in array e rimuovi parole comuni confrontandole con l'array c.w.
    $seo_slug_array = array_diff (split(" ", $seo_slug), seo_slugs_stop_words());
    // Converti l'array sanificato in una stringa
    $seo_slug = join("-", $seo_slug_array);
    return $seo_slug;
}

function seo_slugs_stop_words () {
    return array ("a", "able", "about", "above", "abroad", "according", "accordingly", "across", "actually", "adj", "after", "afterwards", "again", "against", "ago", "ahead", "ain't", "all", "allow", "allows", "almost", "alone", "along", "alongside", "already", "also", "although", "always", "am", "amid", "amidst", "among", "amongst", "an", "and", "another", "any", "anybody", "anyhow", "anyone", "anything", "anyway", "anyways", "anywhere", "apart", "appear", "appreciate", "appropriate", "are", "aren't", "around", "as", "a's", "aside", "ask", "asking", "associated", "at", "available", "away", "awfully", "b", "back", "backward", "backwards", "be", "became", "because", "become", "becomes", "becoming", "been", "before", "beforehand", "begin", "behind", "being", "believe", "below", "beside", "besides", "best", "better", "between", "beyond", "both", "brief", "but", "by", "c", "came", "can", "cannot", "cant", "can't", "caption", "cause", "causes", "certain", "certainly", "changes", "clearly", "c'mon", "co", "co.", "com", "come", "comes", "concerning", "consequently", "consider", "considering", "contain", "containing", "contains", "corresponding", "could", "couldn't", "course", "c's", "currently", "d", "dare", "daren't", "definitely", "described", "despite", "did", "didn't", "different", "directly", "do", "does", "doesn't", "doing", "done", "don't", "down", "downwards", "during", "e", "each", "edu", "eg", "eight", "eighty", "either", "else", "elsewhere", "end", "ending", "enough", "entirely", "especially", "et", "etc", "even", "ever", "evermore", "every", "everybody", "everyone", "everything", "everywhere", "ex", "exactly", "example", "except", "f", "fairly", "far", "farther", "few", "fewer", "fifth", "first", "five", "followed", "following", "follows", "for", "forever", "former", "formerly", "forth", "forward", "found", "four", "from", "further", "furthermore", "g", "get", "gets", "getting", "given", "gives", "go", "goes", "going", "gone", "got", "gotten", "greetings", "h", "had", "hadn't", "half", "happens", "hardly", "has", "hasn't", "have", "haven't", "having", "he", "he'd", "he'll", "hello", "help", "hence", "her", "here", "hereafter", "hereby", "herein", "here's", "hereupon", "hers", "herself", "he's", "hi", "him", "himself", "his", "hither", "hopefully", "how", "howbeit", "however", "hundred", "i", "i'd", "ie", "if", "ignored", "i'll", "i'm", "immediate", "in", "inasmuch", "inc", "inc.", "indeed", "indicate", "indicated", "indicates", "inner", "inside", "insofar", "instead", "into", "inward", "is", "isn't", "it", "it'd", "it'll", "its", "it's", "itself", "i've", "j", "just", "k", "keep", "keeps", "kept", "know", "known", "knows", "l", "last", "lately", "later", "latter", "latterly", "least", "less", "lest", "let", "let's", "like", "liked", "likely", "likewise", "little", "look", "looking", "looks", "low", "lower", "ltd", "m", "made", "mainly", "make", "makes", "many", "may", "maybe", "mayn't", "me", "mean", "meantime", "meanwhile", "merely", "might", "mightn't", "mine", "minus", "miss", "more", "moreover", "most", "mostly", "mr", "mrs", "much", "must", "mustn't", "my", "myself", "n", "name", "namely", "nd", "near", "nearly", "necessary", "need", "needn't", "needs", "neither", "never", "neverf", "neverless", "nevertheless", "new", "next", "nine", "ninety", "no", "nobody", "non", "none", "nonetheless", "noone", "no-one", "nor", "normally", "not", "nothing", "notwithstanding", "novel", "now", "nowhere", "o", "obviously", "of", "off", "often", "oh", "ok", "okay", "old", "on", "once", "one", "ones", "one's", "only", "onto", "opposite", "or", "other", "others", "otherwise", "ought", "oughtn't", "our", "ours", "ourselves", "out", "outside", "over", "overall", "own", "p", "particular", "particularly", "past", "per", "perhaps", "placed", "please", "plus", "possible", "presumably", "probably", "provided", "provides", "q", "que", "quite", "qv", "r", "rather", "rd", "re", "really", "reasonably", "recent", "recently", "regarding", "regardless", "regards", "relatively", "respectively", "right", "round", "s", "said", "same", "saw", "say", "saying", "says", "second", "secondly", "see", "seeing", "seem", "seemed", "seeming", "seems", "seen", "self", "selves", "sensible", "sent", "serious", "seriously", "seven", "several", "shall", "shan't", "she", "she'd", "she'll", "she's", "should", "shouldn't", "since", "six", "so", "some", "somebody", "someday", "somehow", "someone", "something", "sometime", "sometimes", "somewhat", "somewhere", "soon", "sorry", "specified", "specify", "specifying", "still", "sub", "such", "sup", "sure", "t", "take", "taken", "taking", "tell", "tends", "th", "than", "thank", "thanks", "thanx", "that", "that'll", "thats", "that's", "that've", "the", "their", "theirs", "them", "themselves", "then", "thence", "there", "thereafter", "thereby", "there'd", "therefore", "therein", "there'll", "there're", "theres", "there's", "thereupon", "there've", "these", "they", "they'd", "they'll", "they're", "they've", "thing", "things", "think", "third", "thirty", "this", "thorough", "thoroughly", "those", "though", "three", "through", "throughout", "thru", "thus", "till", "to", "together", "too", "took", "toward", "towards", "tried", "tries", "truly", "try", "trying", "t's", "twice", "two", "u", "un", "under", "underneath", "undoing", "unfortunately", "unless", "unlike", "unlikely", "until", "unto", "up", "upon", "upwards", "us", "use", "used", "useful", "uses", "using", "usually", "v", "value", "various", "versus", "very", "via", "viz", "vs", "w", "want", "wants", "was", "wasn't", "way", "we", "we'd", "welcome", "well", "we'll", "went", "were", "we're", "weren't", "we've", "what", "whatever", "what'll", "what's", "what've", "when", "whence", "whenever", "where", "whereafter", "whereas", "whereby", "wherein", "where's", "whereupon", "wherever", "whether", "which", "whichever", "while", "whilst", "whither", "who", "who'd", "whoever", "whole", "who'll", "whom", "whomever", "who's", "whose", "why", "will", "willing", "wish", "with", "within", "without", "wonder", "won't", "would", "wouldn't", "x", "y", "yes", "yet", "you", "you'd", "you'll", "your", "you're", "yours", "yourself", "yourselves", "you've", "z", "zero");
}

Aggiungendo il codice aggiuntivo qui sotto al tuo file functions.php, rimuoverà/nasconderà l'opzione dello slug nel menu a discesa delle impostazioni dello schermo e anche il metabox.

// NASCONDI IL METABOX DELLO SLUG E LE OPZIONI SCHERMO SLUG
function hide_slug_options() {
    global $post;
    global $pagenow;
    $hide_slugs = "<style type=\"text/css\">#slugdiv, #edit-slug-box, [for=\"slugdiv-hide\"] { display: none; }</style>\n";
    if (is_admin() && $pagenow=='post-new.php' OR $pagenow=='post.php') print($hide_slugs);
}
add_action( 'admin_head', 'hide_slug_options' );
30 set 2010 04:02:51
0

Escludere le categorie figlie di una categoria specifica

Abbastanza semplice, ma non ho trovato nessuno che facesse esattamente ciò di cui avevo bisogno. Inoltre, mostrerà il post se viene selezionata la categoria genitore, a meno che quel post non abbia selezionata una categoria figlia di quel genitore.

   /* questo codice esclude tutti i post delle categorie figlie (ID categoria = 20) 
       nella pagina HOME, ma permette di mostrare la categoria genitore (ID categoria = 20). */

    function exclude_category_children($query) {
        $child_cats = (array) get_term_children('20', 'category');
        if ( $query->is_home ) {
        $query->set('category__not_in', $child_cats);
        return $query;
        }
    }
    add_filter('pre_get_posts', 'exclude_category_children');
9 nov 2010 10:17:27
0

Consenti iFrame nell'Editor di WordPress

// permette a TinyMCE di accettare iframe
add_filter('tiny_mce_before_init', create_function( '$a',
'$a["extended_valid_elements"] = "iframe[id|class|title|style|align|frameborder|height|longdesc|marginheight|marginwidth|name|scrolling|src|width]"; return $a;') );
28 dic 2010 02:32:05
10

Rimuovi i menu del backend di amministrazione per tutti gli utenti, tranne l'Utente #1 (solitamente il primo amministratore)

/*-----------------------------------------------------------------------------------*/
/*  Restringe l'accesso
/*-----------------------------------------------------------------------------------*/
function remove_menus () {
global $menu;
$user = wp_get_current_user();
    if ($user->ID!=1) { // Non è l'amministratore,

        $restricted = array(__('Pannello'), __('Articoli'), __('Media'), __('Link'), __('Pagine'), __('Aspetto'), __('Strumenti'), __('Utenti'), __('Impostazioni'), __('Commenti'), __('Plugin'));
        end ($menu);
        while (prev($menu)){
            $value = explode(' ',$menu[key($menu)][0]);
            if(in_array($value[0] != NULL?$value[0]:"" , $restricted)){unset($menu[key($menu)]);}
        }
    }
}
add_action('admin_menu', 'remove_menus');
13 giu 2011 14:14:20
Commenti

L'utente 1 potrebbe essere il primo amministratore. Ma dopo aver aggiunto nuovi amministratori, il primo potrebbe diventare un semplice utente normale. Chiedi le capacità, non i numeri. Inoltre, questo codice dovrebbe stare in un plugin, non nel functions.php. Non c'è alcuna relazione con il tema.

fuxia fuxia
13 giu 2011 14:55:07

In questo modo puoi permettere a tutti gli amministratori di agire normalmente ma allo stesso tempo nascondere il primo amministratore e riservarlo all'amministratore di sistema / team di supporto. Non sono d'accordo che questo codice debba stare in un plugin. Il functions.php è già un plugin. Questo file fondamentalmente si comporta come un plugin Sviluppo_Temi#File_Funzioni

Daniel Sachs Daniel Sachs
13 giu 2011 15:12:00

Ma il functions.php contiene logica legata al tema, perché se cambi tema tutto il codice scompare. Quindi, a meno che il codice non dipenda dal tema e viceversa - non usare il functions.php come un mu-plugin.

fuxia fuxia
13 giu 2011 16:00:24

Sì. Ma consideriamo questo: stai sviluppando un sito web per un cliente. Questo sito utilizzerà sempre un solo tema, quello progettato dal designer. Il tema è il sito. Aggiungi tipi di post personalizzati, metabox, carichi funzioni aggiuntive, ecc. Ora vuoi dare ad alcuni utenti le capacità di amministrazione, ma vuoi nascondere alcune sezioni del sito che il tuo cliente non utilizzerà mai o che potrebbero confonderlo (Link, Strumenti, Commenti, sono i migliori esempi) e dare al team di supporto una sorta di "SuperAdmin" in modo che possano vedere l'intera area di amministrazione.

Daniel Sachs Daniel Sachs
13 giu 2011 16:24:48

Vedo che non sei d'accordo con l'utilizzo, ma la funzione funziona ed è utile, quindi non capisco perché votare -1.

Daniel Sachs Daniel Sachs
13 giu 2011 16:24:59

Non dovrebbe trovarsi in un functions.php – come molte risposte qui, purtroppo – e si romperà prima o poi. Inoltre, viola gli standard di codifica di WordPress. Per favore, non prenderla come una questione personale. Il mio voto è un consiglio per il lettore.

fuxia fuxia
13 giu 2011 17:01:07

Ovviamente, nulla di personale, tosco. Tutti cerchiamo di aiutare e imparare. Non siamo d'accordo, succede :)

Daniel Sachs Daniel Sachs
13 giu 2011 17:03:27

@Daniel Sachs Dai un'occhiata a questo gist e sostituisci user_login con role(?).

kaiser kaiser
13 giu 2011 17:13:48

@kaiser Questo è ottimo, se volessi usarlo come plugin o rimuovere i menu per tutti gli amministratori. Come ho detto, questo permette di rimuovere solo per un utente specifico con ID1

Daniel Sachs Daniel Sachs
13 giu 2011 17:23:16

Se guardi il plugin collegato, permette di impostare gruppi di accesso per "qualsiasi cosa un utente offra (nome di login, ruolo, ID)". Fare affidamento sugli ID in generale è un concetto "non ottimale". Questo è tutto ciò che volevo sottolineare.

kaiser kaiser
13 giu 2011 17:32:16
Mostra i restanti 5 commenti
3

Disabilitare l'avviso di aggiornamento del browser in WordPress 3.2

Disabilita avviso browser obsoleto WordPress

// Disabilita l'avviso di aggiornamento del browser in WordPress 3.2
function disable_browser_upgrade_warning() {
    remove_meta_box( 'dashboard_browser_nag', 'dashboard', 'normal' );
}
add_action( 'wp_dashboard_setup', 'disable_browser_upgrade_warning' );
19 ago 2011 19:37:55
Commenti

Materiale puramente da plugin.

fuxia fuxia
19 ago 2011 19:51:59

@toscho E allora? Funziona comunque. No?

PrivateUser PrivateUser
19 ago 2011 19:55:20

Non dopo aver cambiato tema. I temi sono per i frontend.

fuxia fuxia
19 ago 2011 20:29:18
0

Mostra i file template inclusi

Visualizza un commento inline con il File Template e i file get_template_part inclusi durante il rendering delle pagine. Utile per il troubleshooting di template multiparte.

add_action('all','template_snoop');
function template_snoop(){
    $args = func_get_args();
    if( !is_admin() and $args[0] ){
        if( $args[0] == 'template_include' ) {
            echo "<!-- Template Base: {$args[1]} -->\n";
        } elseif( strpos($args[0],'get_template_part_') === 0 ) {
            global $last_template_snoop;
            if( $last_template_snoop )
                echo "\n\n<!-- Fine Template Part: {$last_template_snoop} -->";
            $tpl = rtrim(join('-',  array_slice($args,1)),'-').'.php';
            echo "\n<!-- Template Part: {$tpl} -->\n\n";
            $last_template_snoop = $tpl;
        }
    }
}
13 ott 2011 18:39:45
0

Funzione Condizionale is_tree()

/* Adattato da csstricks con l'aggiunta degli
antenati .... uso = if(is_tree($id)) { // fai qualcosa } ... Restituisce true se la
pagina è = $id OPPURE qualsiasi sua pagina figlia OPPURE discendenti */

function is_tree($pid) {      // $pid = L'ID della pagina sotto cui cerchiamo le pagine
  global $post;         // carica i dettagli su questa pagina
  $ancestors = get_post_ancestors($post);
  if(is_page()&&($post->post_parent==$pid||is_page($pid)||(in_array($pid,$ancestors))))
    return true;   // siamo nella pagina o in una sottopagina
  else
    return false;  // siamo altrove 
  };
14 ott 2011 19:40:42
0

Mostra gli utenti che hanno inviato il maggior numero di commenti senza un plugin

function top_comment_authors($amount = 5) {
global $wpdb;
$results = $wpdb->get_results('
    SELECT
    COUNT(comment_author_email) AS comments_count, comment_author_email, comment_author, comment_author_url
    FROM '.$wpdb->comments.'
    WHERE comment_author_email != "" AND comment_type = "" AND comment_approved = 1
    GROUP BY comment_author_email
    ORDER BY comments_count DESC, comment_author ASC
    LIMIT '.$amount
);
$output = "<ul>";
foreach($results as $result) {
    $output .= "<li>".$result->comment_author."</li>";
}
$output .= "</ul>";
echo $output;
}

Altre opzioni che puoi utilizzare: $result->comment_author_email $result->comments_count $result->comment_author_url

4 dic 2011 13:56:21
3

Ottieni il vero indirizzo IP dell'utente quando possibile

Testato su: Wordpress 3.0.1

Se stai utilizzando un proxy o un load balancer, aggiungi questo codice al tuo file wp-config.php o functions.php

// Ottiene il vero indirizzo IP dell'utente

$_SERVER['REMOTE_ADDR'] = getRealIpAddress();
function getRealIpAddress( $validate = true ) {
    if ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) && !empty($_SERVER['HTTP_X_FORWARDED_FOR']) ) {
        $ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
        $ip = trim($ips[count($ips) - 1]);
    } elseif ( isset($_SERVER['HTTP_X_REAL_IP']) && !empty($_SERVER['HTTP_X_REAL_IP']) ) {
        $ip = $_SERVER['HTTP_X_REAL_IP'];
    } elseif ( isset($_SERVER['HTTP_CLIENT_IP']) && !empty($_SERVER['HTTP_CLIENT_IP']) ) {
        $ip = $_SERVER['HTTP_CLIENT_IP'];
    } else {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    
    if ( $validate && function_exists('filter_var') &&  filter_var($ip, FILTER_VALIDATE_IP, array('flags' => FILTER_FLAG_IPV4, FILTER_FLAG_NO_PRIV_RANGE, FILTER_FLAG_NO_RES_RANGE)) )
        return $ip;
    elseif ( $validate )
        return long2ip(ip2long($ip));

    return $ip;
}
14 set 2010 00:23:32
Commenti

Cosa fa esattamente questo?

NetConstructor.com NetConstructor.com
14 set 2010 05:21:50

Quando un utente è dietro un proxy o un load balancer, qualsiasi cosa che ottenga l'indirizzo IP dell'utente utilizzando il superglobale $_SERVER['REMOTE_ADDR'] vedrà l'indirizzo IP del proxy o del load balancer. Il proxy/lb a sua volta inserisce l'indirizzo IP originale dell'utente negli header X-Forwarded-For, X-Real-Ip o Client-Ip (a seconda della configurazione del proxy/lb). Pertanto, quando si commenta (o si pubblica, ma è meno rilevante) WP vedrà molti utenti provenienti dallo stesso indirizzo IP. Questo lo risolve sostituendo $_SERVER['REMOTE_ADDR'] con l'IP originale.

gabrielk gabrielk
19 set 2010 21:02:10

Questi sono facili da ingannare aggiungendo manualmente l'header HTTP_X_FORWARDED_FOR in ogni richiesta del browser. Il mio preferito è impostarlo a 127.0.0.1 che poi imposterà $_SERVER['REMOVE_ADDR'] a un valore vuoto con quell'esempio.

hakre hakre
5 nov 2010 23:41:39
0

Escludi la categoria predefinita dalle pagine pubbliche

Esclude la categoria predefinita dalla parte pubblica del sito web.
Il codice esclude l'area di amministrazione, altrimenti non avresti modo di gestire gli articoli assegnati alla categoria predefinita.

add_filter( 'list_terms_exclusions', 'exclude_default_cat' );

function exclude_default_cat( $exclusioni ) {
    if( !is_admin() )
        $exclusioni .=  "AND t.term_id != " . get_option( 'default_category' ) . " ";
    return $exclusioni;
}
4 nov 2010 19:06:45
0

Rimuovi il link "Commenti" dalla barra di amministrazione se lo stato dei commenti è chiuso

Puoi impostare lo stato predefinito dei commenti su 'closed', ma il link ai commenti rimarrà visibile. Basta inserire il seguente codice nel tuo file functions.php per rimuoverlo in base alla condizione. Offre 2 approcci diversi.

/**
 * Disabilita il link 'Commenti' se lo stato predefinito è _closed_
 */
function remove_comments() 
{
    $default_comment_status = get_option( 'default_comment_status' );

    if ( $default_comment_status == 'closed' ) 
    {
        remove_action( 'admin_bar_menu', 'wp_admin_bar_comments_menu', 50 );

        // soluzione opzionale utilizzando la classe WP_Admin_Bar da /wp-includes/class-wp-admin-bar.php
        # global $wp_admin_bar;
        # $wp_admin_bar->remove_menu( 'comments' );
    }
    else 
    {
        return;
    }
}
21 mar 2011 19:51:58
0

Aggiunge un menu a discesa personalizzato a WP_NAV_MENUS dove l'utente può selezionare una classe CSS predefinita per ogni voce del menu

<?php function menu_item_class_select(){
    global $pagenow;
    if ($pagenow == "nav-menus.php"){
?>

<script>
jQuery(document).ready(function(){
    function create_dd(v){
        //crea il menu a discesa
        var dd = jQuery('<select class="my_class"></select>');
        //crea le opzioni del menu
        //array con le opzioni desiderate
        var classes = ["","class1","class2","class3"];
        jQuery.each(classes, function(i,val) {
            if (v == val){
                dd.append('<option value="'+val+'" selected="selected">'+val+'</option>');
            }else{
                dd.append('<option value="'+val+'">'+val+'</option>');
            }
        });
        return dd;
    }
    jQuery(".edit-menu-item-classes").each(function() {
        //aggiunge il menu a discesa
        var t = create_dd(jQuery(this).val());
        jQuery(this).before(t);
        //nasconde tutti gli input
        jQuery(this).css("display","none");
    });
    //aggiorna l'input alla selezione
    jQuery(".my_class").bind("change", function() {
        var v = jQuery(this).val();
        var inp = jQuery(this).next();
        inp.attr("value",v);
    });
});
</script>

<?php } }
add_action('admin_footer','menu_item_class_select');
?>

fonte: https://wordpress.stackexchange.com/a/33816/479

30 nov 2011 13:40:53
0

Rimuovi le voci del menu della Barra di Amministrazione di WordPress 3.3

function dashboard_tweaks() {
    global $wp_admin_bar;
    $wp_admin_bar->remove_menu('wp-logo');
    $wp_admin_bar->remove_menu('about');
    $wp_admin_bar->remove_menu('wporg');
    $wp_admin_bar->remove_menu('documentation');
    $wp_admin_bar->remove_menu('support-forums');
    $wp_admin_bar->remove_menu('feedback');
    $wp_admin_bar->remove_menu('view-site');
}
add_action( 'wp_before_admin_bar_render', 'dashboard_tweaks' );

Riferimento: http://pastebin.com/Wrk0JPxw

19 dic 2011 22:23:22
0

Query per Tag tra Tassonomie Incrociate

Una query memorizzata nella cache che restituisce una stringa HTML simile a get_tags() con tutti i tag per un determinato parametro di Tassonomia, predefinito come Categoria. Puoi utilizzare $where_slug e $where_tax per ottenere i tag degli articoli filtrati da qualsiasi altra tassonomia. SQL testato da WP 3.1 a WP 3.3.1.

function tags_by_other_taxonomy($where_slug,$where_tax = 'category',$bust_cache = false) {
    $cache_key = "{$where_slug}:{$where_tax}";
    $cache = get_transient('tags_by_other_taxonomy');
    $html = '';
    if( true !== $bust_cache and false !== $cache and isset($cache[$cache_key]) and !empty($cache[$cache_key]) ) {
            $html = $cache[$cache_key];
    } else {
        global $wpdb;
        $cat_id = $wpdb->get_var("SELECT tt.term_taxonomy_id FROM $wpdb->terms t INNER JOIN $wpdb->term_taxonomy tt ON t.term_id = tt.term_id WHERE t.slug = '{$where_slug}' AND tt.taxonomy = '{$where_tax}' LIMIT 1");
        if( !empty($cat_id) ) {
            $cat_posts = $wpdb->get_col("SELECT tr.object_id FROM $wpdb->term_relationships tr inner join $wpdb->posts p ON p.ID = tr.object_id WHERE term_taxonomy_id = {$cat_id} AND p.post_status = 'publish' AND p.post_type = 'post'");
            if( count($cat_posts) ) {
                $tags = $wpdb->get_results("SELECT DISTINCT t.name,t.slug FROM $wpdb->term_taxonomy tt
                                INNER JOIN $wpdb->term_relationships tr ON tt.term_taxonomy_id = tr.term_taxonomy_id
                                INNER JOIN $wpdb->terms t ON t.term_id = tt.term_id
                                WHERE tt.taxonomy = 'post_tag' and tr.object_id IN (".implode(',',$cat_posts) .')');
                $html = '<ul class="post-tags-'.$where_slug.'">';
                if( count($tags) ) {
                    foreach($tags as $tag)
                        $html .= '<li><a href="/tag/'.$tag->slug.'/" title="Articoli con tag '.$tag->name.'">'.$tag->name.'</a></li>';
                }
                $html .= '</ul>';
                if( !is_array($cache) )
                    $cache = array();
                $cache[$cache_key] = $html;
                set_transient('sc_cross_tax', $cache, 86400);
            }
        }
    }
    echo $html;
}

Ad esempio, per ottenere tutti i tag per gli Articoli Pubblicati nello slug della Categoria news:

<?php echo tags_by_other_taxonomy('news'); ?>
3 feb 2012 22:23:46