Cea mai bună colecție de cod pentru fișierul tău 'functions.php'

9 sept. 2010, 11:29:00
Vizualizări: 169K
Voturi: 346

La fel ca mulți alții care citesc acum această postare, am parcurs diverse bloguri, forumuri și grupuri de discuții pentru a-mi îmbunătăți cunoștințele despre WordPress. În ultimele 12 luni am avut misiunea de a înlocui utilizarea plugin-urilor prin adăugarea de cod în fișierul functions.php.

Deși sunt complet de acord că plugin-urile sunt foarte utile în multe situații, experiența mea a demonstrat că în 90% din cazuri, deși ar putea exista un plugin, utilizarea acestuia ar putea crea complicații inutile și probleme de compatibilitate. În plus, în multe cazuri, astfel de plugin-uri au adăugat meniuri și alte elemente administrative pe care nu le doresc sau nu am nevoie de ele.

De cele mai multe ori am descoperit că analizând codul plugin-urilor am putut extrage bucata de cod dorită și o pot implementa direct în functions.php. Acest lucru mi-a oferit exact funcționalitatea de care aveam nevoie fără a include elemente inutile.

Așadar, scopul acestei postări este încercarea mea de a vă implica pe voi, cititori/administratori/dezvoltatori, să împărtășiți cu mine și cu ceilalți de aici orice fragmente de cod pe care le considerați utile și le-ați adăugat în fișierul functions.php al temei voastre pentru a extinde sau îmbunătăți WordPress fără a utiliza un plugin.

Când trimiteți un răspuns aici, vă rog să dați fiecărui fragment de cod un titlu, să ne spuneți cu ce versiune de WordPress știți că este compatibil, să includeți orice descriere care credeți că descrie cel mai bine funcția sa și (dacă este cazul) să includeți un link către plugin-ul original sau sursa unde ați găsit informația.

Aștept cu nerăbdare toate răspunsurile voastre și, bineînțeles, voi adăuga continuu propriile mele descoperiri ori de câte ori le găsesc.

Vă rugăm să votați întrebarea și orice răspunsuri pe care le considerați utile făcând clic pe săgeata sus din partea stângă a întrebării sau răspunsului.

25
Comentarii

Te rog să adaugi și vechile tale constatări existente.

hakre hakre
9 sept. 2010 11:38:16

Salut @NetConstructor: Sunt îngrijorat de această întrebare pentru că este o întrebare de tip "Listă de X" despre care oamenii de la StackExchange ne-au spus să fim atenți: http://meta.stackexchange.com/questions/57226/should-we-have-a-list-of-x-close-reason Principala mea preocupare este că atunci când mă gândesc la întrebarea ta, îmi pot imagina un număr aproape infinit de răspunsuri și, ca urmare, mă îngrijorează că această întrebare va duce la o colecție de răspunsuri aleatorii, dar nimic definitiv. Vreau să aflu și alte opinii înainte de a (vota să) o închid, deoarece nu vreau să fiu prea dur, dar am rezerve.

MikeSchinkel MikeSchinkel
9 sept. 2010 14:00:40

Votul meu este fie pentru închidere, fie pentru transformarea în wiki comunitar.

Chris_O Chris_O
9 sept. 2010 15:37:41

Având în vedere că primele 5 răspunsuri au fost date de OP și întrebarea pare să fie mai degrabă orientată către colectarea unui șir de răspunsuri decât către un singur răspuns definitiv, acesta ar trebui să fie un wiki al comunității.

EAMann EAMann
9 sept. 2010 17:43:16

se pare că nu se poate modifica pur și simplu o întrebare într-un wiki. Este corect?

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

Cu toate acestea, acest lucru este util (am găsit 2 fragmente pe care le voi folosi intens) dacă va fi un wiki al comunității și trebuie creat de la zero pentru a face asta, poate putem muta pur și simplu conținutul de aici acolo?

Lemon Bacon Lemon Bacon
10 sept. 2010 02:58:46

@NetConstructor.com ... Am convertit întrebarea în wiki când am scris ultimul meu comentariu. Îmi pare rău dacă a creat vreo confuzie. În mod normal, tu (ca autorul original) poți transforma o întrebare în wiki în orice moment.

EAMann EAMann
10 sept. 2010 03:56:15

@EAMann mulțumesc... Căutam această opțiune dar nu eram sigur unde se afla. Poate după ce ai convertit-o eu pur și simplu nu am mai văzut opțiunea?

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

@NetConstructor.com - Exact. Odată ce este convertită, este convertită... opțiunea este setată și dispare din pagină.

EAMann EAMann
10 sept. 2010 17:23:26

Aș considera acest lucru un stil nepotrivit și aș prefera plugin-uri. a) Sunt construite de dezvoltatori dedicați b) sunt întreținute și ușor de actualizat. Pentru fragmente mici personalizate, recomand plugin-ul Shortcode Exec PHP care oferă o modalitate foarte curată - și portabilă - de a personaliza WordPress-ul tău.

Raphael Raphael
10 nov. 2010 11:43:21

deși interesant, cred că majoritatea oamenilor ar fi de acord că atunci când dezvolți teme, dorești ca lucrurile să fie localizate în fișierul functions.php

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

@NetConstructor - Dacă ai de gând să editezi intrările altora, te rog să ai grijă când o faci, ai stricat indentarea în postarea mea, eu întotdeauna mă străduiesc să mențin indentarea pentru lizibilitate. Aș aprecia, de asemenea, dacă ai putea să-ți faci timp să explici modificările pe care le faci (nu am văzut niciun motiv pentru care să editezi intrarea mea - și nu a existat niciun rezumat al modificărilor).

t31os t31os
28 ian. 2011 18:53:26

@t31os -- Am editat pentru a păstra consistența cu toate înregistrările

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

Toate răspunsurile care nu sunt legate de o temă ar trebui eliminate. Acest thread este un exemplu bun de practici de codare necorespunzătoare.

fuxia fuxia
13 iun. 2011 15:09:56

Aș fi trebuit să nu fiu de acord. Întrebarea nu era legată de temă. Toate modificările aplicabile functions.PHP sunt binevenite și utilizatorii ar trebui să voteze în sus/jos în consecință.

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

Este interesant că nu se menționează nicăieri că fișierul functions.php este cel din directorul temei tale, ceea ce duce la confuzii, cum ar fi aceasta: http://wordpress.stackexchange.com/questions/25341/error-after-editing-functions-php

scribu scribu
9 aug. 2011 03:07:10

Cred că ar fi mai bine să încurajăm oamenii să creeze un plugin personalizat pentru funcționalități în loc să folosească functions.php din tema lor.

Ian Dunn Ian Dunn
16 ian. 2012 20:49:10

@rarst - Referitor la comentariul tău despre închiderea acestui thread, nu acesta este motivul pentru care este listat în wiki-ul comunității?

User User
19 feb. 2012 15:35:19

@Cor van Noorloos utilizarea statutului de wiki comunitate a fost mult redusă și descurajată de rețea. Mai simplu spus, scuza "nu se potrivește cu întrebările și răspunsurile, dar e wiki comunitate!" nu mai funcționează. Răspunsurile de aici au devenit un haos dezordonat și prost întreținut, vizitat doar pentru factorul de distracție. A existat o mișcare intensă în întreaga rețea pentru a elimina astfel de întrebări.

Rarst Rarst
19 feb. 2012 15:43:03

@rarst - De înțeles. Punctul a fost recepționat.

User User
19 feb. 2012 15:55:04

În legătură cu închiderea acestui "wiki" specific, votez pentru redeschiderea lui. Evident, această postare wiki este foarte populară, demonstrată de faptul că are 30.000 de vizualizări, adică de trei ori mai mult decât ORICE altă întrebare sau wiki de pe acest site, iar subiectul în sine a fost votat pozitiv de 119 ori, adică dublu față de orice altă întrebare sau subiect. Dacă considerați că are valoare, vă rugăm să votați pentru redeschiderea lui făcând clic pe linkul "redeschide".

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

@NetConstructor.com Numărul pur de vizualizări ale paginii nu este un indicator al calității. Ar trebui să încurajăm întrebări specifice cu răspunsuri specifice și practici de codare bune. Acest thread este exact opusul.

fuxia fuxia
22 feb. 2012 04:44:30

@toscho - tocmai de aceea acest subiect a fost configurat ca wiki și, prin urmare, acest post este perfect valid. Punctul menționat în legătură cu numărul de vizualizări a fost adus pentru că acest subiect este evident de 3 ori mai popular decât orice alt subiect de pe acest site. Acest website este popular tocmai datorită întrebărilor de acest gen și, prin urmare, nu are sens să îl închidem. Nu cred că se poate dezbate acest lucru decât dacă interesul comunității pentru astfel de subiecte nu are valoare pentru administratori.

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

Voi adăuga încă un comentariu aici bazat pe niște calcule pe care tocmai le-am făcut. Există mai puțin de 790 de utilizatori înregistrați pe acest website cu un rating de "1" sau mai mult. Presupunând că acest grup de persoane reprezintă cei care votează și/sau contribuie efectiv pe acest site (iar 790 fiind un număr extrem de corect), atunci cei 117 oameni care au votat pozitiv această întrebare reprezintă peste 14% din toți utilizatorii activi care au considerat acest subiect util. Votați pentru redeschiderea subiectului, vă rog.

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

@NetConstructor.com Discută pe Meta unde oamenii îți pot vedea mai bine argumentele. :)

fuxia fuxia
24 feb. 2012 19:10:14
Arată celelalte 20 comentarii
Toate răspunsurile la întrebare 30
3

Pre-popularea tipurilor de postări

Iată un exemplu pentru această colecție.

////////////////////////////////////////////////////////////////////////////////////
// Acest cod completează automat tipurile de postări și postările.
///////////////////////////////////////////////////////////////////////////////////

add_filter( 'default_content', 'my_editor_content' );

function my_editor_content( $content ) {

    global $post_type;

    switch( $post_type ) {
        case 'your_post_type_here': //completează automat
            $content = 'Conținutul cu care doriți să pre-populați tipul de postare.';
break;
     }

    return $content;
}

Acest lucru poate fi util atunci când trebuie să postați aceleași informații în mod repetat, cu mici diferențe.

11 nov. 2011 00:36:58
Comentarii

Excelent! Îmi place această opțiune simplă. Poți extinde acest lucru prin prezentarea unor modalități de completare automată a câmpurilor personalizate sau a altor criterii/opțiuni sau chiar prin mijloace de inserare automată a fișierelor media?

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

Cu siguranță pot încerca să extind funcționalitatea. Încă nu am experimentat să o duc mai departe.

Nicole Nicole
14 nov. 2011 16:31:44

Aș fi foarte interesat să văd modalități de extindere a acestui lucru

JasonDavis JasonDavis
11 apr. 2012 12:09:47
2

Includere Automată a Codului Google Analytics

Testat pe: Wordpress 3.1 RC3

Am folosit acest script pe toate site-urile mele începând cu WordPress 2.3.0... pur și simplu adaugă scripturile standard de urmărire Google în subsolul paginii.

// Adaugă Codul de Urmărire 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');

Asigurați-vă că înlocuiți UA-XXXXXXX-X cu propriul dvs. cod de urmărire Google...

15 sept. 2010 18:48:47
Comentarii

mulțumesc pentru share. Eu folosesc și eu acest script, dar aș fi curios să știu dacă ești conștient cum poate fi modificat astfel încât anumite tag-uri, pagini de post type sau chiar postările în sine să poată primi automat valori suplimentare, folosind capacitățile de tracking de campanie pe care Google le oferă. În plus, ce ar trebui adăugat dacă am dori să includem acest lucru în footer-ul tuturor paginilor de admin pentru a urmări activitatea de administrare?

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

Nu sunt sigur despre adăugarea variabilelor de tracking pentru campanii, pur și simplu pentru că nu am avut nevoie de asta încă. Dar pentru a adăuga același script în paginile de admin, ai putea folosi add_action('admin_footer', 'add_google_analytics'); pentru a-l atașa la footer-ul paginilor de administrare.

EAMann EAMann
17 sept. 2010 16:08:27
0

Listează toate constantele pentru informații și depanare

Testat pe: Wordpress 3.0.1

Va afișa informațiile doar dacă sunteți un utilizator autentificat

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

Iată versiunea cu filtru opțional care va potrivi parțial numele constantelor și valorile:

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 sept. 2010 11:32:12
2

Adaugă actualizare automată/instalator de plugin-uri pe localhost

define ('FS_METHOD', 'direct');

Pune acest cod în fișierul tău wp-config.php.

5 nov. 2010 17:19:07
Comentarii

deci asta actualizează automat oricare/și toate pluginurile tale ori de câte ori este disponibil ceva nou?

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

Nu, pur și simplu nu ai nevoie de un login FTP pentru a actualiza core-ul sau pluginurile local

Horttcore Horttcore
9 nov. 2010 10:11:20
3

Schimbă URL-ul implicit pentru Autor

Adaugă acest cod în functions.php pentru a schimba URL-ul implicit al Autorului cu orice dorești,
doar înlocuiește "sellers" cu slug-ul dorit.

// Schimbă URL-ul de la Autor la Vânzători
function new_author_base() {
    global $wp_rewrite;
    $author_slug = 'sellers';
    $wp_rewrite->author_base = $author_slug;
}
add_action('init', 'new_author_base');
21 dec. 2010 22:19:20
Comentarii

Nu ai dori să rulezi acel cod la fiecare încărcare de pagină.

t31os t31os
21 dec. 2010 22:27:01

Da, resetarea rolurilor la fiecare încărcare te scutește de mulți parametri. :) Mai bine folosește pluginul Edit Author Slug.

fuxia fuxia
22 dec. 2010 05:21:51

Am actualizat funcția!!! Mulțumesc pentru sugestie:)

Philip Philip
12 ian. 2011 23:37:33
0

Adăugare buton "Pagina următoare" în editorul 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 ian. 2011 22:13:51
3

Adăugați stiluri personalizate în editorul TinyMCE

Uneori utilizatorii și clienții devin confuzi privind modul în care conținutul lor este afișat în editor față de modul în care apare pe site. Copierea câtorva linii relevante din fișierul principal de stiluri în noul fișier tinymce.css poate ajuta foarte mult:

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

Excelent. Tocmai am descoperit că există o soluție de la Seamus Leahy care extinde acest lucru cu un pas mai departe prin adăugarea unei clase de body în tinymce. http://www.digwp.com/2010/11/actual-wysiwyg

Michal Mau Michal Mau
20 ian. 2011 04:03:48

Nu este deja acoperit de funcționalitățile de bază și stilurile editorului?

kaiser kaiser
1 feb. 2011 09:52:16

Prefer să creez o foaie de stiluri atât pentru front-end cât și pentru TinyMCE dintr-o singură mișcare. Apoi folosesc funcționalitatea de bază a funcției add_editor_style() pentru a include foaia de stiluri și a mă asigura că este încărcată când se încarcă TinyMCE. Articolul Codex la http://codex.wordpress.org/Function_Reference/add_editor_style

Philip Downer Philip Downer
13 sept. 2011 23:42:36
2

Redimensionare imagine mare la încărcare

Imaginea va fi redimensionată conform dimensiunii mari din setările media.

/** redimensionează la încărcare la dimensiunea cea mai mare din setările media */


function replace_uploaded_image($image_data) {
// dacă nu există imagine mare: returnează
if (!isset($image_data['sizes']['large'])) return $image_data;

// calea către imaginea încărcată și imaginea mare
$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'];

// șterge imaginea încărcată
unlink($uploaded_image_location);

// redenumește imaginea mare
rename($large_image_location,$uploaded_image_location);

// actualizează metadatele imaginii și le returnează
$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
Comentarii

Înseamnă asta că fișierul mare original încărcat este de fapt înlocuit? Nu sunt expert în PHP, dar răspunsul pare a fi da?

davemac davemac
20 feb. 2011 03:26:33

@davemac Îmi dau seama că este foarte veche acum discuția, dar din câte înțeleg eu din cod, fișierul imagine original este redimensionat la aceleași dimensiuni ca dimensiunea 'large' setată în ecranul de setări WordPress. Ceea ce e minunat, dar atunci ajungi să ai 2 imagini de aceeași dimensiune. Aș sugera să setezi manual valorile astfel încât imaginea originală să fie doar atât de mare cât cel mai mare fișier pe care îl vei folosi în mod realist pe site-ul tău. Apoi vei avea o imagine aproape originală cu care să lucrezi în viitor.

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

Utilizează figure și figcaption pentru subtitrări

Testat pe: WordPress 3.1.3

(Credit către 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 iun. 2011 11:22:16
0

Iată câteva shortcode-uri utile pe care le puteți folosi:


1. Shortcode simplu pentru butoane de partajare pe Twitter și 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');
// Cum se folosește: [sharethis]

2. Shortcode pentru captură de ecran la distanță folosind API-ul 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" => 'Imaginea mea',
            "w" => '400', // lățime
            "h" => '300' // înălțime
        ), $atts));

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

add_shortcode("snap", "wpr_snap");
// Cum se folosește: [snap url="http://www.example.com" alt="Site mișto!" w="300px" h="200px"]

3. Shortcode simplu pentru a încorpora 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>Browser-ul tău nu suportă Iframe-uri.</p></iframe>';
}
add_shortcode('iframe', 'GenerateIframe');
// Cum se folosește: [iframe href="http://www.exmaple.com" height="480" width="640"]

4. Shortcode pentru includerea unui fișier la distanță

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

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

add_shortcode( 'getfile', 'getfile_content' );
// Cum se folosește: [getfile fileurl="http://www.exmaple.com/somepage.html"]

. Iată câteva fragmente legate de comentarii:

1. Dezactivarea globală a comentariilor

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

2. Adăugarea unei clase CSS diferite pentru comentariile administratorului

if (1 == $comment->user_id)
    echo 'siteadmin'; // Alege clasa aici

3. Un fragment bogat în date pentru afișarea comentariilor - ideal pentru pagini personalizate

$comments = get_comments( array(
    'number'    => 10, // Câte comentarii
    'status'    => 'approve' // Tipul comentariilor
) );

foreach($comments as $eachComment){

    // Colectarea și atribuirea datelor
    $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>Nume: '. $eachComment->comment_author .'</li>';
    echo '<li>A comentat la: <a href="'.$commentPostUrl.'">'. $commentPostTitle .'</a></li>';
    echo '<li>Data comentariului: '. $eachComment->comment_date .'</li>';
    echo '<li>Site comentator: '. $eachComment->comment_author_email .'</</li>';
    echo '<li>Email comentator: '. $eachComment->comment_author_email .'</</li>';
    echo '<li>Acest comentator '. $eachComment->comment_author .' a comentat de '. $userCommentCount .' ori pe site-ul tău</</li>';
    echo '</ul>';
    echo '<p style="padding: 10px;"><strong>'. $eachComment->comment_author .' a scris</strong>: '. $eachComment->comment_content .'</p>';
    echo '</div>';
}
9 ian. 2012 01:50:17
1

Condițional pentru verificarea descendenței în ierarhie

O funcție condițională pentru a verifica dacă pagina curentă este un descendent al ID-ului dat. Utilă pentru a determina dacă o pagină este un nepot, strănepot sau mai jos în arborele ierarhic.

function is_tree($pid) {      // $pid = ID-ul paginii pe care o căutăm în subpaginile ei
    global $post;         // încărcăm detaliile despre această pagină

    $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;   // suntem la pagina sau la o subpagina
    else 
               return false;  // suntem în altă parte
};
3 dec. 2010 01:07:15
Comentarii

Caut asta de ceva timp. Mulțumesc că ai adunat totul! Pot să cer o mică clarificare privind cazul de utilizare. În mod ideal, aș dori să folosesc acest lucru în listele mele de meniu, astfel încât dacă am un meniu părinte de nivel superior în partea de sus a site-ului care afișează doar elementele Gen 1. Când sunt pe un element Gen 2-3, elementul Gen1 poate fi evidențiat printr-un atribut CSS "current-parent". Este posibil acest lucru?

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

Creează o etichetă condițională pentru taxonomii personalizate

În acest exemplu, 'student' a fost un tip de postare personalizată, iar 'stud_cat' a fost taxonomia personalizată. Folosește has_student(null) pentru condițional

    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 dec. 2010 23:46:16
Comentarii

Cred că acum se înlocuiește cu has_term() deoarece versiunea 3.1 a fost lansată?

Rarst Rarst
26 feb. 2011 01:32:10
2

Remedii simple pentru securitatea WordPress

Securitate prin obscuritate este scopul acestor funcții. Acestea fac trei lucruri diferite.

  1. Elimină versiunea din cod. Nu are rost să le spunem oamenilor ce versiune folosim.
  2. Elimină mesajele de eroare (Parolă greșită, Utilizator inexistent etc.) de la ecranele de autentificare admin
  3. Când un administrator postează un comentariu, se adaugă o clasă CSS. Această funcție elimină numele adminului din comentarii.

    //ELIMINĂ VERSIUNEA DIN HEADER
    remove_action('wp_head', 'wp_generator');
    
    //ASCUNDE MESAJELOR DE EROARE LA AUTENTIFICARE (Parolă greșită, Utilizator inexistent etc.)
    add_filter('login_errors',create_function('$a', "return null;"));
    
    // Elimină clasa cu numele adminului în comentarii
    // Sursă: 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 sept. 2011 20:19:38
Comentarii

Eliminarea numărului de versiune WordPress este o practică proastă. Este mult mai sigur să ții WordPress-ul actualizat cu cele mai recente remedieri de securitate ÎN PERMANENT. Bonus: script kiddies vor merge mai departe către versiuni mai vechi.

knutole knutole
12 ian. 2014 18:30:59

@knotole, nu este o practică proastă. Este opinia ta... deși aceasta este destul de standard.

Jeremy Jeremy
20 oct. 2014 23:13:51
0

Înlocuirea Gravatarei Implicite cu o Imagine Personalizată

Tot ce trebuie să personalizezi este calea către imaginea ta implicită.

function custom_gravatar($avatar_defaults) {
    $logo = get_bloginfo('template_directory') . '/images/icons/gravatar_logo.jpg'; //Schimbă cu calea dorită.
    $avatar_defaults[$logo] = get_bloginfo('name');
    return $avatar_defaults;
}//FUNCȚIE FINALIZATĂ    
add_filter( 'avatar_defaults', 'custom_gravatar' );
14 sept. 2011 20:21:41
0

Crearea automată a unei pagini noi la activarea unei teme

if (isset($_GET['activated']) && is_admin()){
    $new_page_title = 'Acesta este titlul paginii';
    $new_page_content = 'Acesta este conținutul paginii';
    $new_page_template = ''; //ex. template-custom.php. Lăsați gol dacă nu doriți un șablon personalizat pentru pagină.

//nu editați sub această linie
$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 dec. 2011 13:47:31
1

Listează toate SubCategoriile

Testat pe: 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;

de asemenea, mai multe informații și funcții în articolul http://wpengineer.com/2025/list-all-subcategories/

17 sept. 2010 11:35:59
Comentarii

De ce ai face asta când există o funcție specială pentru afișarea unei liste de categorii... Vezi: http://codex.wordpress.org/Template_Tags/wp_list_categories#Only_Show_Children_of_a_Category

t31os t31os
11 nov. 2010 19:06:10
0

Curățare automată a SEO Slugs fără a elimina funcționalitatea

Testat pe: Wordpress 3.0.1

Prin adăugarea acestui cod în fișierul functions.php, WordPress va curăța automat URL-ul slug-ului prin eliminarea tuturor cuvintelor inutile. Am extins și funcționalitățile cu personalizări suplimentare care ascund opțiunea de slug din ecranul de opțiuni precum și metabox-ul. Prin includerea codului de mai jos, orice postare nouă creată va fi automat scurtată, dar veți avea în continuare posibilitatea de a edita manual slug-ul făcând clic pe URL-ul de sub titlul postării și salvând postarea.

// CURĂȚARE AUTOMATĂ A SEO SLUG-URILOR PAGINILOR/ POSTĂRILOR DE CUVINTE SCURTE
   add_filter('name_save_pre', 'seo_slugs', 0);
   function seo_slugs($slug) {
    // Nu dorim să modificăm un slug existent
 if ($slug) return $slug;
 global $wpdb;
 $seo_slug = strtolower(stripslashes($_POST['post_title']));
 $seo_slug = preg_replace('/&.+?;/', '', $seo_slug); // eliminăm entitățile HTML
    // eliminăm orice nu este literă, cifră, spațiu sau apostrof
 $seo_slug = preg_replace ("/[^a-zA-Z0-9 \']/", "", $seo_slug);
    // Transformăm în array și eliminăm cuvintele comune comparând cu array-ul c.w.
 $seo_slug_array = array_diff (split(" ", $seo_slug), seo_slugs_stop_words());
    // Transformăm array-ul curățat într-un șir de caractere
 $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");
   }

Prin adăugarea codului suplimentar de mai jos în fișierul functions.php, veți elimina/ascunde opțiunea de slug din meniul dropdown al opțiunilor de ecran precum și metabox-ul.

// ASCUNDEREA METABOX-ULUI SLUG ȘI A OPȚIUNILOR DE ECRAN PENTRU 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 sept. 2010 04:02:51
0

Excludează subcategoriile unei categorii specifice.

Destul de simplu, dar nu am găsit pe nimeni care să facă exact ceea ce aveam nevoie. De asemenea, va afișa postarea dacă categoria părinte este selectată, cu excepția cazului în care acea postare are o subcategorie a acelui părinte selectată.

   /* acest cod exclude toate postările din subcategoriile (ID categorie = 20)
       pe pagina PRINCIPALĂ, dar permite afișarea categoriei părinte (ID categorie = 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

Permiteți Editorului WordPress să Accepte iFrames

// permiteți TinyMCE să accepte iframe-uri
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 dec. 2010 02:32:05
10

Elimină meniurile din panoul de administrare pentru toți utilizatorii, cu excepția Utilizatorului #1 (de obicei primul Admin)

/*-----------------------------------------------------------------------------------*/
/*  Restricționare acces
/*-----------------------------------------------------------------------------------*/
function remove_menus () {
global $menu;
$user = wp_get_current_user();
    if ($user->ID!=1) { // Nu este administrator,

        $restricted = array(__('Bord'), __('Articole'), __('Media'), __('Legături'), __('Pagini'), __('Aspect'), __('Unelte'), __('Utilizatori'), __('Setări'), __('Comentarii'), __('Plugin-uri'));
        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 iun. 2011 14:14:20
Comentarii

Utilizatorul 1 poate fi primul administrator. Dar după adăugarea de noi administratori, primul poate deveni doar un utilizator obișnuit. Cereți capabilități, nu numere. În plus, acest cod ar trebui să fie într-un plugin, nu în functions.php. Nu există nicio legătură cu tema.

fuxia fuxia
13 iun. 2011 14:55:07

În acest fel puteți permite tuturor administratorilor să acționeze normal, dar în același timp să ascundeți primul administrator și să îl rezervați pentru administratorul de sistem / echipa de suport. Nu sunt de acord că acest cod ar trebui să fie într-un plugin. Functions.php este un plugin. Acest fișier practic funcționează ca un plugin Theme_Development#Functions_File

Daniel Sachs Daniel Sachs
13 iun. 2011 15:12:00

Dar functions.php conține logică care este legată de temă, pentru că dacă schimbi tema întregul cod dispare. Deci, dacă codul nu depinde de temă și vice versa – nu folosiți functions.php ca un mu-plugin.

fuxia fuxia
13 iun. 2011 16:00:24

Da. Dar să luăm în considerare următoarele: Dezvolți un website pentru un client. Acest website va folosi întotdeauna doar o singură temă, cea proiectată de designer. Tema este website-ul. Adaugi post types personalizate, metabox-uri, încarci funcții suplimentare etc. Acum dorești să oferi unor utilizatori capabilități de admin, dar vrei să ascunzi unele secțiuni ale site-ului pe care clientul tău nu le va folosi niciodată sau care l-ar putea deruta (Legături, Unelte, Comentarii sunt cele mai bune exemple) și să oferi echipei de suport un fel de "SuperAdmin" pentru a putea vedea întreaga zonă de administrare.

Daniel Sachs Daniel Sachs
13 iun. 2011 16:24:48

Înțeleg că nu ești de acord cu utilizarea, dar funcția funcționează și este utilă, așa că nu înțeleg de ce ai dat -1.

Daniel Sachs Daniel Sachs
13 iun. 2011 16:24:59

Nu are loc într-un functions.php – ca multe alte răspunsuri de aici, din păcate – și va avea probleme mai devreme sau mai târziu. Pe lângă asta, încalcă standardele de codare WordPress. Te rog, nu lua personal. Votul meu este o recomandare pentru cititor.

fuxia fuxia
13 iun. 2011 17:01:07

Desigur, nimic personal, tosco. Cu toții încercăm să ajutăm și să învățăm. Nu suntem de acord, se întâmplă :)

Daniel Sachs Daniel Sachs
13 iun. 2011 17:03:27

@Daniel Sachs Aruncă o privire la acest gist și înlocuiește user_login cu role(?).

kaiser kaiser
13 iun. 2011 17:13:48

@kaiser Acest lucru este minunat, dacă aș vrea să-l folosesc ca un plugin sau să dezactivez meniurile pentru toți administratorii. După cum am spus, acest lucru permite dezactivarea pentru un singur utilizator specific cu ID1

Daniel Sachs Daniel Sachs
13 iun. 2011 17:23:16

Dacă te uiți la plugin-ul menționat, acesta îți permite să setezi grupe de acces pe baza "orice oferă un utilizator (nume de login, rol, ID)". A te baza pe ID-uri în general este un concept care nu este "cea mai bună practică". Asta e tot ce am vrut să subliniez.

kaiser kaiser
13 iun. 2011 17:32:16
Arată celelalte 5 comentarii
3

Dezactivarea avertismentului de actualizare a browserului în WordPress 3.2

Imagine ilustrativă pentru dezactivarea avertismentului de browser

// Dezactivează avertismentul de actualizare a browserului în 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 aug. 2011 19:37:55
Comentarii

Material pur de plugin.

fuxia fuxia
19 aug. 2011 19:51:59

@toscho Și ce? Totuși funcționează. Nu-i așa?

PrivateUser PrivateUser
19 aug. 2011 19:55:20

Nu după schimbarea temelor. Temele sunt pentru interfețe frontale.

fuxia fuxia
19 aug. 2011 20:29:18
0

Afișează fișierele de șabloane incluse

Afisează un comentariu inline cu Fișierul Șablon și fișierele get_template_part care sunt incluse la randarea paginilor. Util pentru depanarea șabloanelor 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 "<!-- Șablon de Bază: {$args[1]} -->\n";
        } elseif( strpos($args[0],'get_template_part_') === 0 ) {
            global $last_template_snoop;
            if( $last_template_snoop )
                echo "\n\n<!-- Sfârșit Partea de Șablon: {$last_template_snoop} -->";
            $tpl = rtrim(join('-',  array_slice($args,1)),'-').'.php';
            echo "\n<!-- Partea de Șablon: {$tpl} -->\n\n";
            $last_template_snoop = $tpl;
        }
    }
}
13 oct. 2011 18:39:45
0

Funcția condițională is_tree()

/* Adaptat din csstricks cu adăugarea de
strămoși .... utilizare = if(is_tree($id)) { // faci ceva } ... Returnează true dacă pagina
este = $id SAU oricare dintre copiii acesteia SAU descendenți */

function is_tree($pid) {      // $pid = ID-ul paginii pentru care căutăm subpagini
  global $post;         // încarcă detaliile despre această pagină
  $ancestors = get_post_ancestors($post);
  if(is_page()&&($post->post_parent==$pid||is_page($pid)||(in_array($pid,$ancestors))))
    return true;   // suntem pe pagină sau pe o subpagină
  else
    return false;  // suntem în altă parte
  };
14 oct. 2011 19:40:42
0

Afișează utilizatorii care au trimis cele mai multe comentarii fără 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;
}

Alte opțiuni pe care le poți utiliza: $result->comment_author_email $result->comments_count $result->comment_author_url

4 dec. 2011 13:56:21
3

Obțineți adresa IP reală a utilizatorului ori de câte ori este posibil

Testat pe: Wordpress 3.0.1

Dacă utilizați un proxy sau un load balancer, adăugați acest cod în fișierul wp-config.php sau functions.php

// Obține adresa IP reală a utilizatorului

$_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 sept. 2010 00:23:32
Comentarii

ce face exact acest lucru?

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

Când un utilizator se află în spatele unui proxy sau load balancer, orice încercare de a obține adresa IP a utilizatorului folosind superglobalul $_SERVER['REMOTE_ADDR'] va returna adresa IP a proxy-ului sau load balancer-ului. Proxy-ul/load balancer-ul la rândul său plasează adresa IP originală a utilizatorului în headerele X-Forwarded-For, X-Real-Ip sau Client-Ip (în funcție de configurația proxy-ului/load balancer-ului). Astfel, atunci când comentează (sau postează, dar asta e mai puțin relevant) WordPress va vedea mulți utilizatori venind de la aceeași adresă IP. Acest cod rezolvă problema prin înlocuirea $_SERVER['REMOTE_ADDR'] cu adresa IP originală.

gabrielk gabrielk
19 sept. 2010 21:02:10

Acestea sunt ușor de păcălit prin adăugarea manuală a header-ului HTTP_X_FORWARDED_FOR în fiecare cerere browser. Preferata mea este să o setez la 127.0.0.1, ceea ce va seta $_SERVER['REMOVE_ADDR'] la o valoare goală în acest exemplu.

hakre hakre
5 nov. 2010 23:41:39
0

Excludează categoria implicită din paginile publice

Exclude categoria implicită din partea publică a site-ului web.
Codul exclude zona de administrare, altfel nu vei avea nicio modalitate de a gestiona articolele atribuite categoriei implicite.

add_filter( 'list_terms_exclusions', 'exclude_default_cat' );

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

Elimină linkul "Comentarii" din bara de administrare dacă statusul comentariilor este închis

Poți seta statusul implicit al comentariilor la 'închis', dar linkul pentru comentarii va rămâne. Pur și simplu adaugă următorul cod în fișierul tău functions.php pentru a-l elimina în funcție de condiție. Oferă 2 abordări diferite.

/**
 * Dezactivează linkul 'Comentarii' dacă statusul implicit este _închis_
 */
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 );

        // soluție opțională folosind clasa WP_Admin_Bar din /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

Adaugă o opțiune personalizată de dropdown în WP_NAV_MENUS unde utilizatorul poate selecta o clasă CSS predefinită pentru fiecare element de meniu

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

<script>
jQuery(document).ready(function(){
    function create_dd(v){
        //creează dropdown-ul
        var dd = jQuery('<select class="my_class"></select>');
        //creează opțiunile dropdown-ului
        //array cu opțiunile dorite
        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() {
        //adaugă dropdown-ul
        var t = create_dd(jQuery(this).val());
        jQuery(this).before(t);
        //ascunde toate câmpurile de input
        jQuery(this).css("display","none");
    });
    //actualizează câmpul de input la selecție
    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');
?>

sursă: https://wordpress.stackexchange.com/a/33816/479

30 nov. 2011 13:40:53
0

Elimină elementele din bara de administrare 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' );

Referință: http://pastebin.com/Wrk0JPxw

19 dec. 2011 22:23:22
0

Interogare Tag-uri Cross Taxonomy

O interogare cache-uită care afișează un șir HTML similar cu get_tags() cu toate tag-urile pentru un parametru Taxonomy dat, implicit fiind Categorie. Poți folosi $where_slug și $where_tax pentru a obține tag-urile postărilor filtrate după orice altă taxonomie. SQL testat pentru WP 3.1 până la 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="Postări etichetate cu '.$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;
}

De exemplu, pentru a obține toate tag-urile pentru Postări Publicate în categoria cu slug-ul știri:

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