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

Урок 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/
 
Последно редактирано:
@KISS Интересувам се дали предлагаш платена помощ за разработчици на плъгини?
Имам сериозен проблем с един плъгин който разработвам и забих доста сериозно и имам нужда от помощ за разрешаването на някои проблеми.

Относно темата и инициативата, поздравления и моите адмираций за труда който полагаш.
Аз бих се присъединил към инициативата и да помогна с каквото мога :)
 
@mid
Прати ми на лично повече информация и ще преценя дали ще имам времето и познанията да ти помогна.
Относно темата, благодаря. Все пак нямам нужда от помощ. Както писах по-рано, идеята е да публикувам моите уроци последователно развиващи се и ставащи по-сложни, а не който реши да публикува уроци. Така ще стане много объркано. Може да се създаде друга тема за нещо подобно ако някой реши.
Поздрави.
 
@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;
}

За какво ти е да заделяш излишно памет? Добра практика ли е според теб?
 
За какво ти е да заделяш излишно памет? Добра практика ли е според теб?
Здравей. Умишлено го направих така, защото мисля че е по-нагледно и разбираемо. И препоръчвам винаги да се програмира по начин, който ще направи кода по-лесен за разбиране и бъдещо редактиране. Но всеки да си прецени сам какъв стил на програмиране да има.
 
@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;
}

За какво ти е да заделяш излишно памет? Добра практика ли е според теб?

На теория, формалните параметри неявно се подават по референция, до момента в който не бъдат променени - тогава им се прави копие. По друг начин казано чак при операция "писане" се прави копие на променливата "$content". До тогава тя е указатвл към променливата подадена на функцията.
И в двата примера използваното количество памет ще е едно и също, защото в първата се работи с референцията на $content, която вече е алокирана + големината на $new_content. Във вторият имаме копие на $content + референция към променливата подадена на функцията, което пак е същото.

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

Поздрави,
Константин.
 
@imagination провери пак. Теорията е полезно нещо, но реалността е нещо съвсем различно ;).
Поставянето на коментар "описващ" фунцкията/метода не е за да е по четим кода. Прави се с друга цел - знаеш какви параметри се подават (и като тип!) и какъв ще бъде изхода (и като тип!).
Четимостта идва от самият стил на писана, дали ще блъскаш всичко на един ред или ще бъдеш модерен и ще спазваш PSR2 стандарта.
 
Урок 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: Плъгините, които показвам, са само като примери и не са завършен продукт. Могат да се подобрят още. Примерно може да се сложи проверка дали има въведен откъс и само тогава да се изписва мета таг.
 
Последно редактирано:
Първото ново нещо, е че името на папката и файла на разширението ви и имената на вашите php функции, трябва да бъдат уникални спрямо другите разширения инсталирани на сайта (и спрямо тези в Wordpress ядрото също, ако говорим за функциите).

Така че тук ще въведа една практика за функциите, която може да ползвате. Започвайте името на вашите функции с комбинация от първите букви на името на папката на плъгина.
А още по-добре използвайте namespaces и енкапуслирайте кода в класове.
 
А още по-добре използвайте namespaces и енкапуслирайте кода в класове.
Да вметна само, че аз не програмирам обектно-ориентирано и примерите ми ще са само с функции. Иначе да, може да се прави и така, но това от мен няма да го научите.
 
Наистина е добра практика да се слагат скобите.
PHP:
..() { } or ..() : endif;
Например за Envato е просто задължително, то си им го пише в Requirements тите.

Също е добра практика да не се затваря последният PHP таг. Визирам ?>
 
  • Like
Реакции: KISS
Наистина е добра практика да се слагат скобите.
PHP:
..() { } or ..() : endif;
Например за Envato е просто задължително, то си им го пише в Requirements тите.

Също е добра практика да не се затваря последният PHP таг. Визирам ?>
Кое, на if-а ли? Може ли линк към техните requirements? Аз това изискване не съм го виждал.
 
ОК, мерси, ще ги разгледам. Това е за теми, не за плъгини, за това не съм го видял.
 
И двете са php. Според мен трябва да се спазват добрите практики. Това различава добрите developer и, от тези които претупват нещата.
Ще ги изчета тези дето ми прати, че аз ще пращам плъгин скоро. Ама просто тези неща не са ги писали в изискванията за codecanyon. Домързяло ли ги е, не знам.
 

Горе