Как да правим Wordpress разширения: Уроци за начинаещи

Дискусията в 'Скриптове и CMS-и' стартирана от KISS, Дек 15, 2016.

  1. KISS

    KISS Active Member

    Рег.:
    Ноем 8, 2009
    Съобщения:
    790
    Харесвания:
    94
    Точки:
    28
    Урок 3: Куки за действия и условни таг функции

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

    Редактирайте разширението от предния път, като го замените с този код:
    PHP:
    <?php

    /*
    Plugin Name: Моето разширение
    Plugin URI: http://example.com/
    Description: Това е описанието на моето разширение.
    Author: Киро и Спиро
    Version: 1.0.0
    Author URI: http://example.com/
    */

    add_filter('the_content''my_google_link_function');

    function 
    my_google_link_function($content)
    {
        if(
    is_single("Google публикация"))
            
    $new_content str_replace("Google""<a href='http://www.google.com'>Google</a>"$content);
        else
            
    $new_content $content;

        return 
    $new_content;
    }

    add_action('wp_footer''my_footer_function');

    function 
    my_footer_function()
    {
        if(
    is_single())
            echo 
    "<script>alert('Това е публикация')</script>";

        if(
    is_page())
            echo 
    "<script>alert('Това е страница')</script>";

        if(
    is_category())
            echo 
    "<script>alert('Това е категория')</script>";

        if(
    is_tag())
            echo 
    "<script>alert('Това е таг')</script>";

        if(
    is_404())
            echo 
    "<script>alert('Това е липсваща страница')</script>";

        if(
    is_user_logged_in())
            echo 
    "<script>alert('Вие сте вписан потребител')</script>";
    }

    ?>
    Имаме промяна във функцията my_google_link_function(). Тук с условната таг функция is_single() проверяваме дали потребителят е в публикация (връща true ако да, false ако не). Също подаваме аргумент "Google публикация". Това е заглавие на публикация в нашия случай, но може да бъде и други неща. Така казваме да се извърши замяната на Google с линк само във публикацията със заглавие "Google публикация". Навсякъде другаде връщаме съдържанието без промяна.

    По-надолу използваме add_action() за да се закачим за действието на име wp_footer. Това действие се задейства когато се изписва футъра в темата. Ние искаме да се изпълни и нашата функция my_footer_function() по това време. Там правим няколко проверки с различни условни таг функции за да разберем в какъв тип страница е потребителя и на края дали е вписан. Изписваме малко JS код със alert съобщение за проба. Не връщаме нищо, понеже това е действие, не е филтър.

    Качете обновената версия на разширението, направете публикация със заглавие "Google публикация" и думата Google в текста и след това разгледайте различни части от сайта за да видите как работят промените.

    Уточнение: Не можем да викаме условните таг функции навсякъде, в някои куки няма да работят, но това са подробности, с които няма да се занимаваме на този етап.


    Повече информация:
    Куки от тип действие: https://codex.wordpress.org/Plugin_API/Action_Reference
    Функция add_action(): https://developer.wordpress.org/reference/functions/add_action/
    Куката от тип действие wp_footer: https://codex.wordpress.org/Plugin_API/Action_Reference/wp_footer
    Условни таг функции: https://codex.wordpress.org/Conditional_Tags
    Условната таг функция is_single(): https://developer.wordpress.org/reference/functions/is_single/
     
    Последно редактирано: Дек 20, 2016
    Blinky харесва това.
  2. bluefighter

    bluefighter Member

    Рег.:
    Юни 19, 2008
    Съобщения:
    442
    Харесвания:
    20
    Точки:
    18
  3. mid

    mid Active Member

    Рег.:
    Февру 20, 2011
    Съобщения:
    485
    Харесвания:
    74
    Точки:
    28
    Пол:
    Мъж
    @KISS Интересувам се дали предлагаш платена помощ за разработчици на плъгини?
    Имам сериозен проблем с един плъгин който разработвам и забих доста сериозно и имам нужда от помощ за разрешаването на някои проблеми.

    Относно темата и инициативата, поздравления и моите адмираций за труда който полагаш.
    Аз бих се присъединил към инициативата и да помогна с каквото мога :)
     
    Blinky харесва това.
  4. KISS

    KISS Active Member

    Рег.:
    Ноем 8, 2009
    Съобщения:
    790
    Харесвания:
    94
    Точки:
    28
    @mid
    Прати ми на лично повече информация и ще преценя дали ще имам времето и познанията да ти помогна.
    Относно темата, благодаря. Все пак нямам нужда от помощ. Както писах по-рано, идеята е да публикувам моите уроци последователно развиващи се и ставащи по-сложни, а не който реши да публикува уроци. Така ще стане много объркано. Може да се създаде друга тема за нещо подобно ако някой реши.
    Поздрави.
     
  5. AMitrev

    AMitrev Well-Known Member

    Рег.:
    Авг 6, 2012
    Съобщения:
    1,482
    Харесвания:
    210
    Точки:
    63
    Пол:
    Мъж
    Място:
    София
    @KISS няма такова нещо като Wordpress програмиране, това си е просто програмиране на PHP.

    PHP:
    function my_google_link_function($content)
    {
        if(
    is_single("Google публикация"))
    $content str_replace("Google""<a href='http://www.google.com'>Google</a>"$content);

        return 
    $content;
    }
    За какво ти е да заделяш излишно памет? Добра практика ли е според теб?
     
    hristonev харесва това.
  6. KISS

    KISS Active Member

    Рег.:
    Ноем 8, 2009
    Съобщения:
    790
    Харесвания:
    94
    Точки:
    28
    Здравей. Умишлено го направих така, защото мисля че е по-нагледно и разбираемо. И препоръчвам винаги да се програмира по начин, който ще направи кода по-лесен за разбиране и бъдещо редактиране. Но всеки да си прецени сам какъв стил на програмиране да има.
     
  7. imagination

    imagination Active Member

    Рег.:
    Юли 26, 2011
    Съобщения:
    198
    Харесвания:
    42
    Точки:
    28
    Пол:
    Мъж
    На теория, формалните параметри неявно се подават по референция, до момента в който не бъдат променени - тогава им се прави копие. По друг начин казано чак при операция "писане" се прави копие на променливата "$content". До тогава тя е указатвл към променливата подадена на функцията.
    И в двата примера използваното количество памет ще е едно и също, защото в първата се работи с референцията на $content, която вече е алокирана + големината на $new_content. Във вторият имаме копие на $content + референция към променливата подадена на функцията, което пак е същото.

    Добрите практики изискват (а кодинг стандартите даже задължават) в началото на функцията да обявиш явно коя променлива ще съдържа резултата. Това се прави с единствената цел кода да е по-ясен и четим. Също така е добре да има един return; в тялото на функцията. Е, аз не го правя :)

    Поздрави,
    Константин.
     
  8. AMitrev

    AMitrev Well-Known Member

    Рег.:
    Авг 6, 2012
    Съобщения:
    1,482
    Харесвания:
    210
    Точки:
    63
    Пол:
    Мъж
    Място:
    София
    @imagination провери пак. Теорията е полезно нещо, но реалността е нещо съвсем различно ;).
    Поставянето на коментар "описващ" фунцкията/метода не е за да е по четим кода. Прави се с друга цел - знаеш какви параметри се подават (и като тип!) и какъв ще бъде изхода (и като тип!).
    Четимостта идва от самият стил на писана, дали ще блъскаш всичко на един ред или ще бъдеш модерен и ще спазваш PSR2 стандарта.
     
  9. imagination

    imagination Active Member

    Рег.:
    Юли 26, 2011
    Съобщения:
    198
    Харесвания:
    42
    Точки:
    28
    Пол:
    Мъж
    Това какво общо има с използването на паметта ? И да проверих, оказах се прав :)
    Поздрави.
     
  10. KISS

    KISS Active Member

    Рег.:
    Ноем 8, 2009
    Съобщения:
    790
    Харесвания:
    94
    Точки:
    28
    Урок 4: Малко SEO разширение. Упражнение на куки и условни таг функции.

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

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

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

    Създайте една папка my-small-seo-plugin и php файл вътре my-small-seo-plugin.php с този код:

    PHP:
    <?php

    /*
    Plugin Name: Моето малко SEO разширение
    Plugin URI: http://example.com/
    Description: Забранява индексирането на страници от тип: резултат от търсене, таг, автор и прикачен файл. За публикациите поставя техния откъс като мета описание, а пък за категориите използва тяхното описание.
    Author: Киро и Спиро
    Version: 1.0.0
    Author URI: http://example.com/
    */

    add_action('wp_head''mssp_add_to_head');

    function 
    mssp_add_to_head()
    {
        if(
    is_search() || is_tag() || is_author() || is_attachment())
            echo 
    '<meta name="robots" content="noindex, follow">';

        if(
    is_single())
            echo 
    '<meta name="description" content="'.esc_attr(get_the_excerpt()).'">';

        if(
    is_category())
            echo 
    '<meta name="description" content="'.esc_attr(trim(strip_tags(category_description()))).'">';
    }

    ?>
    Можете да прочетете описанието на плъгина в хедър данните за да видите какво прави.

    А относно php кода, първо ползваме кука от тип действие, подобна на wp_footer от предния урок, но този път е wp_head, за да изпълним код преди затварящия </head> таг.

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

    След това пак използваме такива функции и изписваме мета описание само за публикациите, като за описание ползваме техния откъс. Вземаме откъса с функцията get_the_excerpt() и я минаваме и през функцията esc_attr(), която е специално направена да превърне всичко във вид подходящ за HTML атрибут (ще работи и без нея, но е добра практика да се ползва, друг път ще говорим за нея).

    И на края проверяваме дали сме в категория и ако сме там изписваме описанието на текущата категория (вземаме го с category_description()) като мета описание, като първо му махаме HTML таговете (със strip_tags()), понеже Wordpress му добавя автоматични p тагове и също махаме новия ред на края (с trim()), че и това се добавя.

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

    Забележка 1: За да видите кутийката за откъса в поста, трябва да го включите от горе в дясно в настройките на изгледа.
    Забележка 2: Плъгините, които показвам, са само като примери и не са завършен продукт. Могат да се подобрят още. Примерно може да се сложи проверка дали има въведен откъс и само тогава да се изписва мета таг.
     
    Последно редактирано: Дек 29, 2016
  11. Torbalan Trolski

    Torbalan Trolski Well-Known Member

    Рег.:
    Авг 1, 2013
    Съобщения:
    2,081
    Харесвания:
    430
    Точки:
    83
    А още по-добре използвайте namespaces и енкапуслирайте кода в класове.
     
    hristonev харесва това.
  12. KISS

    KISS Active Member

    Рег.:
    Ноем 8, 2009
    Съобщения:
    790
    Харесвания:
    94
    Точки:
    28
    Да вметна само, че аз не програмирам обектно-ориентирано и примерите ми ще са само с функции. Иначе да, може да се прави и така, но това от мен няма да го научите.
     
  13. Asitora Studio

    Asitora Studio Member

    Рег.:
    Март 12, 2011
    Съобщения:
    69
    Харесвания:
    18
    Точки:
    8
    Наистина е добра практика да се слагат скобите.
    PHP:
    ..() { } or ..() : endif;
    Например за Envato е просто задължително, то си им го пише в Requirements тите.

    Също е добра практика да не се затваря последният PHP таг. Визирам ?>
     
    KISS харесва това.
  14. KISS

    KISS Active Member

    Рег.:
    Ноем 8, 2009
    Съобщения:
    790
    Харесвания:
    94
    Точки:
    28
    Кое, на if-а ли? Може ли линк към техните requirements? Аз това изискване не съм го виждал.
     
  15. Sky

    Sky Well-Known Member

    Рег.:
    Юли 29, 2012
    Съобщения:
    8,794
    Харесвания:
    635
    Точки:
    113
    Пол:
    Мъж
    Място:
    Казанлък
    KISS харесва това.
  16. Asitora Studio

    Asitora Studio Member

    Рег.:
    Март 12, 2011
    Съобщения:
    69
    Харесвания:
    18
    Точки:
    8
  17. KISS

    KISS Active Member

    Рег.:
    Ноем 8, 2009
    Съобщения:
    790
    Харесвания:
    94
    Точки:
    28
    ОК, мерси, ще ги разгледам. Това е за теми, не за плъгини, за това не съм го видял.
     
  18. Asitora Studio

    Asitora Studio Member

    Рег.:
    Март 12, 2011
    Съобщения:
    69
    Харесвания:
    18
    Точки:
    8
    И двете са php. Според мен трябва да се спазват добрите практики. Това различава добрите developer и, от тези които претупват нещата.
     
  19. KISS

    KISS Active Member

    Рег.:
    Ноем 8, 2009
    Съобщения:
    790
    Харесвания:
    94
    Точки:
    28
    Ще ги изчета тези дето ми прати, че аз ще пращам плъгин скоро. Ама просто тези неща не са ги писали в изискванията за codecanyon. Домързяло ли ги е, не знам.
     
  20. Asitora Studio

    Asitora Studio Member

    Рег.:
    Март 12, 2011
    Съобщения:
    69
    Харесвания:
    18
    Точки:
    8
    Като цяло това са добри практики в писането на PHP. Дали е тема или плъгин, метода е един и същ. Ако имаш въпроси свързани с WP, бих ти помогнал.
    Все пак трябва да се помага... :)
     

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

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