1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn more.

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

Дискусията в 'Wordpress Форум' стартирана от ktomov, Септ 10, 2012.

  1. ktomov

    ktomov Premium

    Рег.:
    Ян 22, 2010
    Съобщения:
    2,707
    Харесвания:
    511
    Точки:
    0
    Направи ми впечатление, че скоро време не съм писал в този раздел, та да взема да се отбележа.

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

    PHP:
    // Добавя клас my-custom-class към първата публикация за лесно стилизиране
    function wp001_first_post_class$firstclass ) {
        global 
    $wp_query;
        if( 
    == $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);
    add_filter'style_loader_src''wp006_remove_script_version'15);

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

    Функциите може да ги намерите като добавка, която само трябва да активирате в мнението ми по-долу - цък тук
     
    Последно редактирано: Септ 10, 2012
    venci, Странникът, dalasweb и 8 други харесват това.
  2. Stoyan Dimitrov

    Stoyan Dimitrov New Member

    Рег.:
    Окт 24, 2010
    Съобщения:
    430
    Харесвания:
    29
    Точки:
    0
    От: functions.php - безкрайните възможности които ни дава този файл!

    Страхотно инфо. Имаш реп от мен ;)
     
  3. тео

    тео Well-Known Member

    Рег.:
    Ноем 15, 2010
    Съобщения:
    1,867
    Харесвания:
    290
    Точки:
    83
    От: 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:
     
    Последно редактирано от модератор: Септ 10, 2012
    snux, BlackFriday и ktomov харесват това.
  4. Noke

    Noke Well-Known Member

    Рег.:
    Септ 15, 2008
    Съобщения:
    3,487
    Харесвания:
    466
    Точки:
    83
    От: functions.php - безкрайните възможности които ни дава този файл!

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

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

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

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

    ПС: Ако сте фенове на quick & dirty подхода и бързате, може да ми игнорирате писанията. Посочените чалъми работят и в тоя си вид. Четете само ако държите много на сайтовете си и искате всичко да е оптимално нагласено и възможностите за осиране да са сведени до минимум.
     
    Последно редактирано: Септ 10, 2012
    Alf и ktomov харесват това.
  5. rombeca

    rombeca Active Member

    Рег.:
    Ноем 9, 2010
    Съобщения:
    910
    Харесвания:
    176
    Точки:
    43
    От: 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 евала. :)
     
    BlackFriday и ktomov харесват това.
  6. ktomov

    ktomov Premium

    Рег.:
    Ян 22, 2010
    Съобщения:
    2,707
    Харесвания:
    511
    Точки:
    0
    Re: От: functions.php - безкрайните възможности които ни дава този файл!

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

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

    Мерси на тези които се включиха в темата, ще се радвам ако има и още :)
     
  7. snux

    snux Well-Known Member

    Рег.:
    Февру 22, 2009
    Съобщения:
    1,458
    Харесвания:
    100
    Точки:
    63
    От: functions.php - безкрайните възможности които ни дава този файл!

    Най-накрая полезна тема - You must spread some Reputation around before giving it to ktomov again.
     
  8. webstil

    webstil Well-Known Member

    Рег.:
    Март 21, 2009
    Съобщения:
    1,431
    Харесвания:
    42
    Точки:
    48
    От: functions.php - безкрайните възможности които ни дава този файл!

    Велики сте ей!!
     
  9. ktomov

    ktomov Premium

    Рег.:
    Ян 22, 2010
    Съобщения:
    2,707
    Харесвания:
    511
    Точки:
    0
    Ето ги моите функции от първото мнение под формата на добавка за тези които не искат да редактират файла functions.php поради споменатите от Noke причини по-горе. Просто сложете файла predpriemach.php в папката wp-content/plugins/ и активирайте добавката Functions Pimp :)D) от админ панела. Или от админ панела изберете Plugins -> Add New -> Upload и архивчето predpriemach.zip

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

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

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

  10. po_taka

    po_taka New Member

    Рег.:
    Септ 27, 2008
    Съобщения:
    400
    Харесвания:
    13
    Точки:
    0
    Професия:
    PHP programmer
    Място:
    Пловдив
    не съм запознат с WP, но ако изнесете тези функционалности в plugin няма ли да спечелите ?
     
  11. Noke

    Noke Well-Known Member

    Рег.:
    Септ 15, 2008
    Съобщения:
    3,487
    Харесвания:
    466
    Точки:
    83
    От: Re: От: functions.php - безкрайните възможности които ни дава този файл!

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

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

    Ама това е за отделен топик, че тук ще стане мазало и съвсем ще се обърка аудиторията.
     
  12. nikolai.mt

    nikolai.mt Active Member

    Рег.:
    Апр 10, 2012
    Съобщения:
    558
    Харесвания:
    29
    Точки:
    28
    Извинявам се за оффтопика, но дали от functions.php има възможност да се смени футера в тема, която принципно не позволява това и сайта блокира при промяна във футера?
     
  13. ktomov

    ktomov Premium

    Рег.:
    Ян 22, 2010
    Съобщения:
    2,707
    Харесвания:
    511
    Точки:
    0
    За твойто питане има отговори как да се разкодира футера в този раздел. Ще ви помоля да не се вкарва офтопик в темата.
     
  14. ktomov

    ktomov Premium

    Рег.:
    Ян 22, 2010
    Съобщения:
    2,707
    Харесвания:
    511
    Точки:
    0
    Тъй. Загубих някой друг час в опити, та да ви попитам дали да си блъскам главата още.

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

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

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

    Прав си, но има една голяма част от теми, които ползвам които просто ме затрудняват в пъти ако трябва да правя дъщерна тема. Слава богу по-голямата част от авторите слагат чейнджлог на променените файлове при ъпдейта на темплейтите си и от това успявам да се ориентирам кои файлове трябва да бъдат сравнени. В по-голямата част от случаите става дума за едва 3-4 файла. В момента работя по темплейт съставен от 127 файла от които съм редактирал над 80 за да отговарят на желаното от мен.
    Но дай да не изпадаме в офтопик.
     
    Devastion харесва това.
  15. rombeca

    rombeca Active Member

    Рег.:
    Ноем 9, 2010
    Съобщения:
    910
    Харесвания:
    176
    Точки:
    43
    От: functions.php - безкрайните възможности които ни дава този файл!

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

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

    ktomov Premium

    Рег.:
    Ян 22, 2010
    Съобщения:
    2,707
    Харесвания:
    511
    Точки:
    0
    Re: От: functions.php - безкрайните възможности които ни дава този файл!

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

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

    Що се отнася до натоварването - голяма част от тези функции не променят кой знае колко състоянието на системата, просто защото видоизменят вече използвана функция в системата. В най-лошият случай да имате 2-3 проверки повече към базата данни.
     
  17. Странникът

    Странникът Well-Known Member

    Рег.:
    Окт 14, 2011
    Съобщения:
    4,122
    Харесвания:
    411
    Точки:
    83
    От: Re: functions.php - безкрайните възможности които ни дава този файл!

    Да, мисля, че ще бъде полезно. Още повече, че наистина има полезни неща, които много помагат за оформянето на един сайт, но някой от потребителите не знаят къде какво да направят, нищо, че е елементарно и добре обяснено. Все пак не на всеки му се удава ровичкането във файловете.
     
  18. Noke

    Noke Well-Known Member

    Рег.:
    Септ 15, 2008
    Съобщения:
    3,487
    Харесвания:
    466
    Точки:
    83
    От: functions.php - безкрайните възможности които ни дава този файл!

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

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

    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' );
     
  19. Noke

    Noke Well-Known Member

    Рег.:
    Септ 15, 2008
    Съобщения:
    3,487
    Харесвания:
    466
    Точки:
    83
    От: functions.php - безкрайните възможности които ни дава този файл!

    А това горещо се препоръчва да не се практикува. Всъщност е заклемейно от ВП девелъпърското съсловие. Предпоставка за много jQuery несъвместимости е. И разни други работи. Наскоро даже имаше голям сеир по въпроса - СЕО-то на един от най-популярните комерсиални плъгини псуваше ТемеФорест авторите дето го правят това в темите си...
     
  20. ktomov

    ktomov Premium

    Рег.:
    Ян 22, 2010
    Съобщения:
    2,707
    Харесвания:
    511
    Точки:
    0
    Мерси за съветите Noke! Ще ползвам твоята функция за lightbox-а ако нямаш нищо против.
    А за jquery-то, би ли дал линк към дискусията, че ми стана любопитно? Интересен е факта, че на много места се препоръчва да се зарежда jquery от cdn-а на гугъл поради ред причини. В интерес на истината съм по-склонен да мисля, че разработчика на добавката е некадърник след като влиза в конфликти с официалната версия на jquery. Също така до сега не съм имал проблем с която и да е било добавки/темплейти и прочие, въпреки че съм ползвал скрипта от cdna на гугъл.

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

Сподели страницата