functions.php - безкрайните възможности които ни дава този файл!

ktomov

Premium
Направи ми впечатление, че скоро време не съм писал в този раздел, та да взема да се отбележа.

Както ставя ясно от заглавието на темата, това за което ще пиша тук е възможностите които ни се отварят чрез файла functions.php в темплейта. То не е в самият файл магията, а от филтрите, които присъстват в самият wordpress. Та следващите функции може да ги добавите директно във файла на вашата тема и ще свършат точно това което е описано.

PHP:
// Добавя клас my-custom-class към първата публикация за лесно стилизиране
function wp001_first_post_class( $firstclass ) {
    global $wp_query;
    if( 0 == $wp_query->current_post )
        $firstclass[] = 'my-custom-class'; //Тук трябва да се промени с името на новият клас
        return $firstclass;
}
add_filter( 'post_class', 'wp001_first_post_class' );

PHP:
// Лесен начин за добавяне на еднакво съдържание чрез шорткод.
// По този начин може да създадете каквито желаете шорткоди и те ще бъдат заменени в публикацията.
// [myshortcode] ще изведе "Visit my website" с линк към mywebsite.com
function wp002_myshortcode(){
        return '<a href="http://mywebsite.com">Visit my website</a>';
}
add_shortcode('myshortcode', 'wp002_myshortcode');


PHP:
// Добавя миниатюри (снимки) в рсс фийда.
function wp003_post_thumbnail_feeds($content) {
        global $post;
        if(has_post_thumbnail($post->ID)) {
                $content = '<div>' . get_the_post_thumbnail($post->ID) . '</div>' . $content;
        }
        return $content;
}
add_filter('the_excerpt_rss', 'wp003_post_thumbnail_feeds');
add_filter('the_content_feed', 'wp003_post_thumbnail_feeds');

PHP:
// Промяна на генератор тага. Много го премахват, за да се защитят от злонамерени "хакери"
// По този начин може да залъжете ботовете, че ползвате съвсем различен CMS
function wp004_change_generators() { 
		return '<meta name="generator" content="WordPress 2012.9" />'; 
		}
add_filter( 'the_generator', 'wp004_change_generators' );

PHP:
// Добавяне на lightbox към всички картинки в статията чрез rel="lightbox".
// Имайте предвид, че може да го промените с каквото желаете. Освен това се добавя и Title атрибут от заглавието на публикацията.
function wp005_lightbox_rel($content) {
		global $post;
		$pattern ="/<a(.*?)href=('|\")(.*?).(bmp|gif|jpeg|jpg|png)('|\")(.*?)>/i";
		$replacement = '<a$1href=$2$3.$4$5 rel="lightbox" title="'.$post->post_title.'"$6>';
		$content = preg_replace($pattern, $replacement, $content);
		return $content;
}
add_filter('the_content', 'wp005_lightbox_rel');

PHP:
// Премахва query стринга при зареждане на цсс и джаваскриптовете. Обикновено там стои версията на добавката.
// По съвет от гугъл за pagespeed. Пример:
// <script type='text/javascript' src='http://domain.com/wp-includes/js/jquery/jquery.js?ver=1.7.2'></script>
// ще стане
// <script type='text/javascript' src='http://domain.com/wp-includes/js/jquery/jquery.js'></script>
function wp006_remove_script_version( $src ){
        $parts = explode( '?', $src );
        return $parts[0];
}
add_filter( 'script_loader_src', 'wp006_remove_script_version', 15, 1 );
add_filter( 'style_loader_src', 'wp006_remove_script_version', 15, 1 );


PHP:
// Добавя линк към публикацията в рсс фийда след съдържанието. Полезно ако ви скейпват съдържанието чрез рсс
function wp007_rss_link($content) {
		if(is_feed()){
			$content = '.$content.';
			$extra = "<a href='" . get_permalink() . "'>Кликнете тук</a>";
		}
		return $content . $extra;
}
add_filter('the_excerpt_rss', 'wp007_rss_link');
add_filter('the_content', 'wp007_rss_link');

PHP:
// Зарежда jQuery от CDN-а на google вместо от wp-includes папката
add_action( 'init', 'wp008_jquery_register' );
function wp008_jquery_register() {
		if ( !is_admin() ) {
			wp_deregister_script( 'jquery' );
			wp_register_script( 'jquery', ( 'https://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js' ), false, null, true );
			wp_enqueue_script( 'jquery' );
		}
}

PHP:
// Ограничаване на възможните файлове за качване. По този начин ще се допуснат само gif и jpeg файлове.
function wp009_restrict_mime($mimes) {
		$mimes = array(
            'jpg|jpeg|jpe' => 'image/jpeg',
            'gif' => 'image/gif',
		);
		return $mimes;
}
add_filter('upload_mimes','wp009_restrict_mime');

PHP:
// Заменя нежеланите думи в коментарите с други. Подходящи при спам, а и ако желаете да вкултурите потребителите си
// Пример: 'Дума за замяна' => 'Заменената дума'. Имайте предвид, че последния ред от низа не трябва да има запетая в края.
function wp_010_filter_comment($comment) {
		$replace = array(
			'fuck' => 'f***',
			'suck' => 's**k'
		);
		$comment = str_replace(array_keys($replace), $replace, $comment);
		return $comment;
}
add_filter( 'pre_comment_content', 'wp_010_filter_comment' );

Ще се радвам ако и вие споделите нещичко ;)

Повече информация за add_filter -> http://codex.wordpress.org/Function_Reference/add_filter
Повече информация за add_shortcode -> http://codex.wordpress.org/Function_Reference/add_shortcode

Функциите може да ги намерите като добавка, която само трябва да активирате в мнението ми по-долу - цък тук
 
Последно редактирано:
От: functions.php - безкрайните възможности които ни дава този файл!

PHP:
add_filter( 'login_headerurl', 'namespace_login_headerurl' );
    /**
    * Променя изписваното УРЛ при вход
    *
    * @param $url
    */
    function namespace_login_headerurl( $url ) {
    $url = home_url( '/' );
    return $url;
    }

    add_filter( 'login_headertitle', 'namespace_login_headertitle' );
    /**
    * Променя тайтъла на логото при вход
    *
    * @param $title
    */
    function namespace_login_headertitle( $title ) {
    $title = get_bloginfo( 'name' );
    return $title;
    }

    add_action( 'login_head', 'namespace_login_style' );
    /**
    * Променя логото при вход
    */
    function namespace_login_style() {
    echo '<style>.login h1 a { background-image: url( ' . get_template_directory_uri() . '/images/logo.png ) !important; }</style>';
    }

PHP:
// Добавя Google Analytics Tracking Code във футера - за да не ви се налага да инсталирате добавки

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


PHP:
// Ако искате различен граватар - променете пътя към файла
    function custom_gravatar($avatar_defaults) {
    $logo = get_bloginfo('template_directory') . '/images/icons/gravatar_logo.jpg'; //промяната тук.
    $avatar_defaults[$logo] = get_bloginfo('name');
    return $avatar_defaults;
    }//END FUNCTION
    add_filter( 'avatar_defaults', 'custom_gravatar' );

PHP:
//показва потребителите с най-много коментари
    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>";
    //за резултат може да използвате също
    //$result->comment_author_email
    //$result->comments_count
    //$result->comment_author_url
    }
    $output .= "</ul>";
    echo $output;
    }

Страшна тема :rolleyes:
 
Последно редактирано от модератор:
От: functions.php - безкрайните възможности които ни дава този файл!

Много хубава тема. Понеже ми е особена интересна, ще изкоментирам някои моменти и ще ги нацепя на отделни постове, щото много неща имам да казвам :) .

Първо, шляпването на някои от функциите в самата тема не се смята за добра практика. Най-юзърфрендли е - да, но съм длъжен да го спомена. Най-общо - ако добавя функционалност към сайта, следва да е в плъгин. Само ако е свързано с визуалния стил - в темата. Една от практичните причини е, че ако сте добавили важна функционалност към сайта си в темата, при превключване на друга (тема) автоматично я губите. А повечето хора не знаят какво точно вършат тия скриптчета и трудно ще се усетят защо изведнъж сайтът им е спрял да се държи както очакват...

Голяма част от горните функции могат да се пляснат в същия си вид в мини къстъм плъгинче и ще работят по същия начин. Ако не ме мързеше, можеше да направя едно полуготово, в което да си пляскате наготово такива добавки, ама какво да се прави.. :rolleyes: .

После ще пиша още.

ПС: Ако сте фенове на quick & dirty подхода и бързате, може да ми игнорирате писанията. Посочените чалъми работят и в тоя си вид. Четете само ако държите много на сайтовете си и искате всичко да е оптимално нагласено и възможностите за осиране да са сведени до минимум.
 
Последно редактирано:
От: functions.php - безкрайните възможности които ни дава този файл!

Noke, това предполагам важи и при ъпдейт на темата, най-вероятно ще се подмени файла functions.php и ще изчезнат всички добавени функции.

Понеже си играя да си правя мои теми, това ще ми е супер полезно.

И да пусна и аз една фунция:

PHP:
function navi() {
// Създава къстъм навигация на станиците с постовете от типа: 1 2 3 4
	global $wp_query;
	$max_page = $wp_query->max_num_pages;
	$nump=6; //Тук може да се настрои колко номера да се показват.

	if($max_page > 1) echo '<div class="navigation"><span class="pages">Pages:</span>';

	if ($max_page!=1) {
		$paged = intval(get_query_var('paged'));
		if(empty($paged) || $paged == 0) $paged = 1;

		if($paged!=1)echo '<a href="'.get_pagenum_link($paged-1).'" class="prev" title="Previous">&laquo;</a>';

		if($paged!=1) echo '<a href="'.get_pagenum_link(1).'">01</a>';
		else echo '<span class="current">01</span>';

		if($paged-$nump>1) $start=$paged-$nump; else $start=2;
		if($paged+$nump<$max_page) $end=$paged+$nump; else $end=$max_page-1;

		if($start>2) echo " ... ";

		for ($i=$start;$i<=$end;$i++) {
			$zero = '';
			if($i < '10') $zero = '0';
			if($paged!=$i) echo '<a href="'.get_pagenum_link($i).'">'.$zero.$i.'</a>';
			else echo '<span class="current">'.$zero.$i.'</span>';
		}

		if($end<$max_page-1) echo " ... ";

		if($paged!=$max_page) echo '<a href="'.get_pagenum_link($paged+1).'" class="next" title="Next">&raquo;</a>';

		if($paged!=$max_page) echo '<a href="'.get_pagenum_link($max_page).'" class="last" title="Last">&raquo;&raquo;</a>';
			else echo '<span class="current">'.$max_page.'</span>';
	}

	if($max_page > 1) echo '</div>';

}

Вика се с:

PHP:
<?php navi(); ?>

обикновено в index.php след пост.

Не съм я писал аз, да не стават грешки... просто я ползвам тук-там.

@ktomov евала. :)
 
Re: От: functions.php - безкрайните възможности които ни дава този файл!

После ще пиша още.

Така е, наистина при ъпгрейд или промяна на темплейта, по-горните промени изчезват. Аз от своя страна държа файл с горните функции на десктопа и винаги си ги добавям ако ъпгрейдвам темплейта. Отделно на това ползвам compare за сравнение на файловете при ъпгрейд, защото няма 1 тема която да съм инсталирал до сега и да не съм правил много корекции - та по този начин се и сещам, ако евентуално съм забравил да въведа функциите :)

Идеята за добавка не е лоша, но ще е малко играчка, защото има стойности които ръчно трябва да се набият според сайта и желаната функционалност, така че без админ панел няма да се размине.

Мерси на тези които се включиха в темата, ще се радвам ако има и още :)
 
От: functions.php - безкрайните възможности които ни дава този файл!

Най-накрая полезна тема - You must spread some Reputation around before giving it to ktomov again.
 
Ето ги моите функции от първото мнение под формата на добавка за тези които не искат да редактират файла functions.php поради споменатите от Noke причини по-горе. Просто сложете файла predpriemach.php в папката wp-content/plugins/ и активирайте добавката Functions Pimp :)D) от админ панела. Или от админ панела изберете Plugins -> Add New -> Upload и архивчето predpriemach.zip

Имайте предвид, че за да работят част от функциите ще трябва да редактирате плъгина ръчно! Това се отнася за функции като шорткода и първата за къстъм клас-а. Ако има интерес може за в бъдеще да се обновява плъгина като идеята ще е да се включват/изключват различните функции чрез чекбокс в админ панела, както и от там да стават редакциите за гореизброените стойности по файла. Но за сега нямам време.

Също така ще помоля хората които добавят функции в темата да слагат префикс пред имената на функциите (както в първото ми мнение wp***_) за да се избегнат евентуалните проблеми с други добавки които са регистрирали същите имена на функции.
 

Прикачени файлове

  • predpriemach.zip
    2.3 KB · Преглеждания: 30
От: Re: От: functions.php - безкрайните възможности които ни дава този файл!

Така е, наистина при ъпгрейд или промяна на темплейта, по-горните промени изчезват. Аз от своя страна държа файл с горните функции на десктопа и винаги си ги добавям ако ъпгрейдвам темплейта. Отделно на това ползвам compare за сравнение на файловете при ъпгрейд, защото няма 1 тема която да съм инсталирал до сега и да не съм правил много корекции - та по този начин се и сещам, ако евентуално съм забравил да въведа функциите :)
Това е много трудно за мениджмънт.
Най-добрата практика за избягване на тоя вид усложнения е ползването на дъщерна тема.
Всички къстъмизации се слагат в нея и ъпгрейдите са автоматични и безпроблемни в 99.8% от случаите.

Правя дъщерна тема (то не че е голям труд) за абсолютно всеки сайт, за който не правя специална тема, а ползвам готова. Дори аз да съм я правил тая готовата.

Ама това е за отделен топик, че тук ще стане мазало и съвсем ще се обърка аудиторията.
 
Извинявам се за оффтопика, но дали от functions.php има възможност да се смени футера в тема, която принципно не позволява това и сайта блокира при промяна във футера?
 
Извинявам се за оффтопика, но дали от functions.php има възможност да се смени футера в тема, която принципно не позволява това и сайта блокира при промяна във футера?

За твойто питане има отговори как да се разкодира футера в този раздел. Ще ви помоля да не се вкарва офтопик в темата.
 
Тъй. Загубих някой друг час в опити, та да ви попитам дали да си блъскам главата още.

Имате ли желание да се пусне добавка със страница в админ панела за контрола и? Така всеки ще може да избира коя от функциите да ползва и коя не, чрез елементарен чекбокс. Освен това ще има възможност за въвеждане на стойностите от администраторския панел, така че всякаква редакция на файла ще бъде извършвана само от админ панела, без ръчно човъркане.

Да отбележа, че ще се спазват няколко принципа:
1. Плъгина ще може да се тегли само и единствено от този форум, няма да бъде добавян в wordpress архива.
2. Плъгина ще бъде свободен за редакция от който пожелае.
3. Плъгина ще бъде с НЕКОМЕРСИАЛНА цел, така че всеки който има желание да го модифицира, ще трябва да се съобразява с това.
4. Всеки който сподели функция тук в тази тема, ще трябва да каже дали е съгласен тя да бъде включена в добавката или не.

Имайте предвид, че не съм професионалист в програмирането, а съм свикнал да дялкам с брадвата както Амоуна казва. За момента имам работещ вариант на голяма част от нещата които искам да се заложат в него. Ще чакам отзивите ви, както и евентуалните ви идеи и препоръки.

Най-добрата практика за избягване на тоя вид усложнения е ползването на дъщерна тема.
Всички къстъмизации се слагат в нея и ъпгрейдите са автоматични и безпроблемни в 99.8% от случаите.
Прав си, но има една голяма част от теми, които ползвам които просто ме затрудняват в пъти ако трябва да правя дъщерна тема. Слава богу по-голямата част от авторите слагат чейнджлог на променените файлове при ъпдейта на темплейтите си и от това успявам да се ориентирам кои файлове трябва да бъдат сравнени. В по-голямата част от случаите става дума за едва 3-4 файла. В момента работя по темплейт съставен от 127 файла от които съм редактирал над 80 за да отговарят на желаното от мен.
Но дай да не изпадаме в офтопик.
 
От: functions.php - безкрайните възможности които ни дава този файл!

Идеи и препоръки казваш.
Може би трябва да се тества откъм натоварване при положение, че някой дето не разбира зареди всички функции.

А функцията която пуснах аз, съм я взел от безплатна тема и не знам какво е положението при нея. Ако искаш да проверя кой беше автора и да редактирам поста като го напиша в коментарите.
 
Re: От: functions.php - безкрайните възможности които ни дава този файл!

Идеи и препоръки казваш.
Може би трябва да се тества откъм натоварване при положение, че някой дето не разбира зареди всички функции.

А функцията която пуснах аз, съм я взел от безплатна тема и не знам какво е положението при нея. Ако искаш да проверя кой беше автора и да редактирам поста като го напиша в коментарите.

Това забравих да го вмъкна. Такива функции които изискват допълнително редактиране на кода, като това <?php navi(); ?> да се извиква в index/category/tag.php не мисля да се включват в добавката. Тя ще е по-скоро за лесни функции които да променят функционалността на системата без да се изисква допълнителна редакция на файловете. За пример добавените от мен и от Тео функции по-горе.

Също така, наистина няма да е лошо да споменавате от къде сте взели снипета, ако не сте го писали вие.

Що се отнася до натоварването - голяма част от тези функции не променят кой знае колко състоянието на системата, просто защото видоизменят вече използвана функция в системата. В най-лошият случай да имате 2-3 проверки повече към базата данни.
 
От: Re: functions.php - безкрайните възможности които ни дава този файл!

Имате ли желание да се пусне добавка със страница в админ панела за контрола и? ...

Да, мисля, че ще бъде полезно. Още повече, че наистина има полезни неща, които много помагат за оформянето на един сайт, но някой от потребителите не знаят къде какво да направят, нищо, че е елементарно и добре обяснено. Все пак не на всеки му се удава ровичкането във файловете.
 
От: functions.php - безкрайните възможности които ни дава този файл!

Ще изкоментирам някои от примерите първо, после ще добавям нови..

PHP:
// Добавяне на lightbox към всички картинки в статията чрез rel="lightbox".
// Имайте предвид, че може да го промените с каквото желаете. Освен това се добавя и Title атрибут от заглавието на публикацията.
function wp005_lightbox_rel($content) {
		global $post;
		$pattern ="/<a(.*?)href=('|\")(.*?).(bmp|gif|jpeg|jpg|png)('|\")(.*?)>/i";
		$replacement = '<a$1href=$2$3.$4$5 rel="lightbox" title="'.$post->post_title.'"$6>';
		$content = preg_replace($pattern, $replacement, $content);
		return $content;
}
add_filter('the_content', 'wp005_lightbox_rel');

Вместо това горе, предпочитам да щадя моя си (на сървъра де) процесор и да прехвърля работата на браузъра на посетителя:

PHP:
/**
 * Print JavaScript in the footer - add 'rel="lightbox"' to the image tags.
 * 
 */
function wp005_print_footer_script() {

	echo "<script type='text/javascript'>\n";
	echo "var jq = jQuery.noConflict();\n";
	echo "jq( function () {\n";
			
		echo 'jq( "a[href$=\'.jpg\'], a[href$=\'.jpeg\'], a[href$=\'.png\'], a[href$=\'.gif\']" ).attr( \'rel\', \'lightbox\' );' . "\n";
	
	echo "});\n";	
	echo "</script>\n";
}

add_action( 'wp_footer', 'wp005_print_footer_script' );
 
От: functions.php - безкрайните възможности които ни дава този файл!

PHP:
// Зарежда jQuery от CDN-а на google вместо от wp-includes папката
add_action( 'init', 'wp008_jquery_register' );
function wp008_jquery_register() {
		if ( !is_admin() ) {
			wp_deregister_script( 'jquery' );
			wp_register_script( 'jquery', ( 'https://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js' ), false, null, true );
			wp_enqueue_script( 'jquery' );
		}
}

А това горещо се препоръчва да не се практикува. Всъщност е заклемейно от ВП девелъпърското съсловие. Предпоставка за много jQuery несъвместимости е. И разни други работи. Наскоро даже имаше голям сеир по въпроса - СЕО-то на един от най-популярните комерсиални плъгини псуваше ТемеФорест авторите дето го правят това в темите си...
 
Мерси за съветите Noke! Ще ползвам твоята функция за lightbox-а ако нямаш нищо против.
А за jquery-то, би ли дал линк към дискусията, че ми стана любопитно? Интересен е факта, че на много места се препоръчва да се зарежда jquery от cdn-а на гугъл поради ред причини. В интерес на истината съм по-склонен да мисля, че разработчика на добавката е некадърник след като влиза в конфликти с официалната версия на jquery. Също така до сега не съм имал проблем с която и да е било добавки/темплейти и прочие, въпреки че съм ползвал скрипта от cdna на гугъл.

Що се отнася до идеята за плъгина - до момента само двама човека може да се каже, че искат да има такова нещо. Да разбирам ли, че ви е по-удобно да биете функциите ръчно и да не си губя времето? :)
 
Последно редактирано:

Горе