Cea mai bună colecție de cod pentru fișierul tău 'functions.php'
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.

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.

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?

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

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...

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?

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.

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 );
}

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');

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

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;
}

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' );

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

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

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

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');

Î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 Î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.

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' );

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>';
}

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
};

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?

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;
}

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

Remedii simple pentru securitatea WordPress
Securitate prin obscuritate este scopul acestor funcții. Acestea fac trei lucruri diferite.
- Elimină versiunea din cod. Nu are rost să le spunem oamenilor ce versiune folosim.
- Elimină mesajele de eroare (Parolă greșită, Utilizator inexistent etc.) de la ecranele de autentificare admin
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' );

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.

Î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' );

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);
}
}

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/

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

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' );

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');

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;') );

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');

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.

Î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

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.

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.

Î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.

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.

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 Aruncă o privire la acest gist și înlocuiește user_login
cu role
(?).

@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

Dezactivarea avertismentului de actualizare a browserului în WordPress 3.2
// 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' );

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;
}
}
}

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
};

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

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;
}

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ă.

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;
}

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;
}
}

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');
?>

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

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'); ?>
