Статьи

Быстрое развитие BuddyPress

Работа с BuddyPress поверх WordPress — это супер захватывающая вещь, она добавляет платформе совершенно новое измерение и действительно демонстрирует огромный потенциал.

BuddyPress, как и другие плагины, расширяет основные функциональные возможности WordPress. Хотя для фрилансера или компании важно признать, что BuddyPress в отличие от других плагинов добавляет функциональность эпических пропорций.

Цель этого урока — показать вам, как быстро и функционально продемонстрировать подтверждение концепции, не совершая кардинальных грехов.


В этом уроке мы будем использовать комбинацию функций PHP, jQuery и WordPress, чтобы расширить BuddyPress настолько, чтобы продемонстрировать концепцию.

Работая над профилями пользователей, мы без каких-либо средств добавим ссылку, позволяющую пользователям посещать область закладок участника.

Область закладок будет заполнена списком закладок, которые участник решил сохранить при просмотре любого сайта с поддержкой BuddyPress.

Область закладок, которые могут быть сохранены, будет применена только к постам WordPress, однако вы можете использовать эту возможность дальше и применить ее к другим областям веб-сайта на WordPress, который создает постоянную ссылку.


Сегодня мы будем опираться на тему bp-default и создадим собственную дочернюю тему. Ниже приведена структура, которую вы должны были создать.

Структура темы
  • style.css — некоторые дополнительные стили для значков, кнопок и списков (это не будет обсуждаться).
  • sidebar.php — мы будем называть наш виджет отсюда.
  • header.php — требуется одна модификация.
  • functions.php — Регистрация скриптов и применение фильтра.
  • _inc / img / — Количество файлов изображений, которые будут использоваться.
  • _inc / js / bookmarks.js — jQuery и AJAX.
  • members / single / home.php — некоторая логика PHP для включения загрузчика шаблонов.
  • members / single / bookmarks / ajax.php — используется для наших вызовов AJAX.
  • members / single / bookmarks / loop.php — поиск закладок через профили участников.
  • members / single / bookmarks / remove.php — удаление закладок через мой профиль участника.
  • members / single / bookmarks / save.php — Хранение закладок через мой профиль участника.
  • members / single / bookmarks / view.php — Загрузчик шаблонов хакерских закладок.
  • members / single / bookmarks / widget.php — Вызывается на сайт sidebar.php .

style.css — в style.css нам нужно минимальное количество кода, чтобы можно было выбирать темы через wp-admin . Давайте сделаем это сейчас.

1
2
3
4
5
6
7
8
9
/*
Theme Name: Bookmark theme
Description: Child theme from bp-default with added support for member bookmarks.
Version: 1.0
Author: WPTuts
Author URI: http://wp.tutsplus.org
Tags: buddypress
Template: bp-default
*/

Tags: buddypress уведомит BuddyPress о том, что мы используем тему с поддержкой BP.

Template: bp-default проинструктирует BuddyPress, что, когда эта тема активна, наследовать ее функциональность от темы bp-default, если файл темы не был изменен.

Внутри sidebar.php нам нужно загрузить widget.php .

1
locate_template(array(‘members/single/bookmarks/widget.php’), true);

Давайте продолжим и зарегистрируем файл bookmarks.js , он будет необходим на каждой странице. В functions.php добавить следующее.

01
02
03
04
05
06
07
08
09
10
11
12
function px_bookmark_scripts() {
    if(!is_admin()) {
        wp_enqueue_script(
            ‘px-scripts-functions’,
            get_stylesheet_directory_uri() .
            array(‘jquery’),
            ‘1.0’,
            true
        );
    }
}
add_action(‘wp_enqueue_scripts’,’px_bookmark_scripts’);

wp_enqueue_script принимает 5 параметров.

  1. Ручка — Дайте вашему сценарию имя.
  2. Источник — путь к вашему сценарию.
  3. Зависимости — какие сценарии понадобятся вашему сценарию для работы.
  4. Версия — номер версии вашего скрипта.
  5. In footer — если false, ваш скрипт будет загружен с помощью wp_head . Если установлено значение true, он будет загружаться с wp_footer .

Якорь прикреплен к сообщению

Браузеры нашего сайта смогут добавлять или удалять сообщения WordPress в свои закладки, щелкнув ссылку «Добавить в закладки» или «Удалить из закладок», расположенную внизу каждого сообщения.

При нажатии на любой из якорей мы будем использовать AJAX и делать запрос к PHP-скрипту. После выполнения мы обновим виджет боковой панели.

Если браузер вошел как участник сайта, он может сохранить любые «Списки закладок», которые в данный момент хранятся в сеансе и отображаются в виджете.

functions.php

01
02
03
04
05
06
07
08
09
10
function px_bookmark_link() {
    global $post;
    if(@in_array($post->ID, $_SESSION[‘bookmarks’])) :
        $content .= ‘<a href=»‘.get_permalink().’» class=»delete-bookmark» data-post-id=»‘.$post->ID.’» data-post-name=»‘.get_the_title().’»>Remove from bookmarks</a>’;
    else :
        $content .= ‘<a href=»‘.get_permalink().’» class=»add-bookmark» data-post-id=»‘.$post->ID.’» data-post-name=»‘.get_the_title().’»>Add to bookmarks</a>’;
    endif;
    return $content;
}
add_filter(‘the_tags’, ‘px_bookmark_link’);

Эта функция вызывается на каждой итерации цикла, используя add_filter и the_tags качестве нашей ловушки.

Мы сообщаем WordPress, что внутри этой функции нам нужен доступ к элементам в $wp_query и, следовательно, $post . Это позволит нам получить the_id , the_title и the_permalink .

Некоторая логика применяется, когда этот код выполняется, чтобы определить, какую ссылку показывать. Если у пользователя уже есть элемент в текущем сеансе, мы покажем привязку «Удалить из закладок» и наоборот. in_array() позволяет нам проверить это.

in_array() будет отмечать уведомления, если в error_reporting есть эта директива, мы используем символ @ для подавления этих уведомлений (хакерство).

Используя данные, возвращаемые в $post мы формируем две привязки для добавления и удаления закладок (все важные здесь атрибуты data ), которые впоследствии будут использоваться с нашими вызовами AJAX в bookmarks.js .

Для полного ознакомления с доступными фильтрами посетите Кодекс .


Виджет состояния

Теперь у нас есть ссылка, давайте создадим виджет, который будет постоянно отображаться на боковой панели и будет заполняться или очищаться по требованию.

Изображение выше отражает конечные состояния виджета в 3 сценариях.

  1. Нет закладок во время входа или выхода.
  2. Закладки, сохраненные в сеансе, но не вошедшие в систему .
  3. Закладки, сохраненные в сеансе во время входа .

Следующий блок кода помещается в widget.php и вложен в разметку HTML.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
if($_SESSION[‘bookmarks’]) :
    foreach($_SESSION[‘bookmarks’] as $key => $value) :
        $keys[] = $key;
        $start_count = min($keys);
    endforeach;
endif;
for($i = $start_count; $i < $start_count + count($_SESSION[‘bookmarks’]); $i++) :
    if($_SESSION[‘bookmarks’][$i]) :
        $bookmark = get_post($_SESSION[‘bookmarks’][$i]);
        echo ‘<li id=»bookmark-‘.$bookmark->ID.’»>’;
        echo ‘<a href=»‘.$bookmark->post_name.’»>’.$bookmark->post_title.'</a>’;
        echo ‘</li>’;
    endif;
endfor;

При создании этого проекта была проблема с данными сеанса, которые продолжали появляться при выводе. Некоторые значения были удалены, но ключ сохранялся. Установка $start_count позднее для использования при печати данных сеанса решила эту проблему.

Здесь важно отметить, как извлечь элементы из $_SESSION['bookmarks'] которые будут созданы на следующем этапе.

На каждой итерации мы используем get_post() для запроса базы данных WordPress с сохраненными целочисленными значениями в $_SESSION['bookmarks'] . Который вернет все необходимые для чтения человеком данные, которые нам нужны.

1
2
3
4
5
6
7
8
if(is_user_logged_in()) :
    // Show SAVE button
else :
    // Show «LOGIN TO SAVE» message.
endif;
if($_SESSION[‘bookmarks’]) :
    // Show CLEAR button
endif;

Этот последний фрагмент логики в widget.php определяет, какие кнопки и текст следует отображать рядом с виджетом, в зависимости от состояния текущего сеанса и
также, если пользователь вошел или вышел.


jQuery потрясающий, здесь мы будем использовать метод delegate и будем слушать клики на наших важных якорях. Мы проверим наличие следующих пунктов.

  • Якоря с классом add-bookmark
  • Якоря с классом delete-bookmark
  • Якоря с классом clear-bookmarks

Используя hasClass мы можем проверить, какой элемент был выбран в методе делегата, и hasClass требуемый вызов AJAX .

Если вы собираетесь встроить это в более крупный проект, рассмотрите возможность использования шаблона pubsub .

Сначала запишите некоторые переменные, чтобы мы не слишком «плескались в DOM». Все селекторы DOM выше расположены в widget.php .

Мы сообщаем jQuery прослушивать щелчок по всем перечисленным классам, а через функцию обратного вызова мы сообщаем ему, что делать. Следующие части кода, которые будут добавлены, будут размещены непосредственно после e.preventDefault() .

Использование preventDefault() — это более preventDefault() способ аннулировать действие по умолчанию, когда присутствует JavaScript. Вот некоторые обсуждения, связанные с preventDefault() по переполнению стека .

Следующие части кода, которые будут добавлены, будут размещены непосредственно после e.preventDefault() .

После того, как пользователь нажал на любую из «важных привязок», нам нужно сохранить значения атрибутов данных, которые были прикреплены к привязкам на шаге 2 . Это позволит нам отправлять и извлекать нужные нам данные.

Следующий код может стать немного многословным, так как мы будем показывать и скрывать элементы, основанные на том, какой элемент был нажат, с этим предварительным курсором приведенный ниже код
Минимум, который будет функционировать без учета эстетики. Однако, пожалуйста, загрузите исходный код и посмотрите на эти строки.

Здесь мы используем hasClass чтобы отличить, какой элемент был нажат, с помощью jQuery для поиска по нашему нажатому элементу.

Исходя из результатов, мы каждый раз настраиваем наш вызов AJAX немного по-разному. При этом url и data , запрашиваемые и отправляемые каждый раз, меняются незначительно.

Обратите внимание ?method=add добавлен в $ajax_path . Это эквивалент http://site.com/path/to/ajax.php?method=add .

При добавлении закладки в текущий сеанс единственным элементом, который нам нужно передать в наш PHP-код, является идентификатор того сообщения, которое было сохранено в переменной $post_id .

Когда jQuery получает успешный ответ, мы добавляем этот элемент в текущий список закладок в области виджетов как элемент списка. Используя $post_id , $post_name и $post_href здесь.

Когда страница обновится, будет добавлен код, добавленный в widget.php на шаге 3 .

В строке 7 последнего фрагмента в методе success есть небольшая подпрограмма, которая определяет, есть ли какие-либо элементы списка в области виджета. Это ранее упоминавшийся слегка подробный код, который не более чем показывает и скрывает некоторые элементы DOM. Он был удален для удобства чтения здесь, на Wptuts +. Двигаемся дальше …

Как и в if($that.hasClass('add-bookmark')) здесь мы проверяем, нажали ли элементы, имеющие класс delete-bookmark .

Как только эта подпрограмма была введена, url в вызове AJAX слегка изменяется, посылая другую строку запроса. А именно ?method=delete .

Когда возвращается успешный ответ, мы удаляем этот элемент списка из текущих закладок, хранящихся в виджете.

Применение некоторой логики таким же образом, как в подпрограмме add-bookmark чтобы определить, будет ли удаленный элемент последним. На основании этого результата элементы DOM снова показываются или скрываются.

Последний фрагмент кода здесь используется для очистки всех закладок в виджете, установив для строки запроса url другой метод и сбросив любые привязки на странице по умолчанию «Добавить в закладки», чтобы отобразить пустой $_SESSION . Это делается с помощью each method jQuery, чтобы найти все вхождения класса delete-bookmark (привязка, прикрепленная к сообщениям с помощью add_filter ) и переключением его на значение по умолчанию
add-bookmark .


Теперь мы создадим код PHP, указанный в вызовах AJAX выше, который будет использоваться для добавления, удаления и удаления всех закладок из сеанса.

В ajax.php мы создадим следующие 3 функции.

  • add_bookmark()
  • delete_bookmark()
  • clear_bookmarks()

Давайте сначала создадим add_bookmark()

1
2
3
4
5
6
function add_bookmark() {
    $post_id = $_GET[‘post_id’];
    if(@!in_array($post_id, $_SESSION[‘bookmarks’])) :
        $_SESSION[‘bookmarks’][] = $post_id;
    endif;
}

Сначала мы сохраняем $post_id ранее переданный в bookmarks.js через data: 'post_id=' + $post_id .

Затем мы снова используем функцию in_array чтобы определить, следует ли добавить этот элемент в сеанс закладок.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
function delete_bookmark() {
    $post_id = $_GET[‘post_id’];
 
    foreach($_SESSION[‘bookmarks’] as $key => $value) :
        $keys[] = $key;
    endforeach;
    $start_count = min($keys);
 
    if(@in_array($post_id, $_SESSION[‘bookmarks’])) :
        for($i = $start_count; $i < $start_count + count($_SESSION[‘bookmarks’]); $i++) :
            if($_SESSION[‘bookmarks’][$i] === $post_id) :
                unset($_SESSION[‘bookmarks’][$i]);
            endif;
        endfor;
    endif;
}

В функции delete_bookmark() мы снова сохраняем $post_id .

Используя ту же технику для вывода наших закладок в widget.php, устанавливается $start_count .

Затем мы определяем, существует ли переданный элемент ( $post_id ) в сеансе закладок с помощью in_array , и сбрасываем любые совпадающие значения.

1
2
3
4
5
function clear_bookmark() {
    session_start();
    session_unset();
    session_destroy();
}

Наконец, clear_bookmark() уничтожает все данные сеанса.

Нам понадобится еще один кусок кода для этого файла для завершения. Перейдите к началу файла и добавьте следующее.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
session_start();
 
$method = $_GET[‘method’];
 
switch($method) {
    case «add» :
        add_bookmark();
    break;
    case «delete» :
        delete_bookmark();
    break;
    case «clear» :
        clear_bookmark();
    break;
}

Мы используем session_start() для возобновления текущего сеанса. Это очень важно здесь.

Затем мы сохраняем метод, который передается с помощью url в наших $.ajax .

На основании текущего значения $method мы вызываем соответствующую функцию.


Член закладки

Файлы, с которыми мы будем иметь дело до конца этого урока, перечислены ниже.

  • members / single / home.php — этот файл является модифицированной версией bp-default / members / single / home.php .
  • members / single / bookmarks / loop.php — используется для получения любых ранее сохраненных списков закладок участников.
  • members / single / bookmarks / remove.php — используется для удаления любых сохраненных списков закладок.
  • members / single / bookmarks / save.php — используется для сохранения любых списков закладок, хранящихся в текущем сеансе.
  • members / single / bookmarks / view.php — используется как временный загрузчик шаблонов.

Внутри home.php мы добавим элемент списка в неупорядоченный список внутри div с идентификатором item-nav .

Используя глобальную $bp мы можем быстро сформировать требуемый URL.

1
2
global $bp;
echo ‘<li><a href=»‘.$bp->displayed_user->domain.’?component=bookmarks»>Bookmarks</a></li>’;

Это один из небольших грехов, которые мы совершаем на дороге, чтобы продемонстрировать доказательство концепции. Однако важным подтверждением здесь является повторное подтверждение концепции и быстрое развитие.

Если бы мы решили расширить эту функцию, мы бы хотели использовать хуки BuddyPress.

1
2
if($_GET[‘component’] == ‘bookmarks’) :
   locate_template(array(‘members/single/bookmarks/view.php’), true);

Тем не менее, внутри home.php мы проверяем строку запроса, которая позволит нам обслуживать пользовательские шаблоны.

1
2
3
4
5
6
7
if(!$_GET[‘action’]) :
    locate_template(array( ‘members/single/bookmarks/loop.php’), true);
elseif($_GET[‘action’] == ‘save’ && is_user_logged_in() && bp_is_home()) :
    locate_template(array( ‘members/single/bookmarks/save.php’), true);
elseif($_GET[‘action’] == ‘remove’ && is_user_logged_in() && bp_is_home()) :
    locate_template(array( ‘members/single/bookmarks/remove.php’ ), true);
endif;

В view.php (наш загрузчик шаблонов make-shift) мы проверяем 2 действия и, если ни одно из них не было определено, мы показываем список сохраненных закладок.

Вернувшись к шагу 3, была добавлена ​​логика для определения привязок, отображаемых в виджете, на основе текущего состояния $_SESSION['bookmarks'] и того, вошел ли пользователь в систему.

Давайте создадим небольшую таблицу в базе данных, которая будет использоваться для хранения списка закладок, которые соответствуют каждому члену.

1
2
3
4
5
6
7
8
9
DROP TABLE IF EXISTS `bookmarks`;
CREATE TABLE `bookmarks` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `user_id` int(11) NOT NULL,
    `created` date NOT NULL,
    `post_ids` text NOT NULL,
    `list_name` text NOT NULL,
    PRIMARY KEY (`id`)
)

MySQL выше создаст новую таблицу с 5 полями для хранения данных закладок.

После создания пришло время перейти в save.php .

Сохранить список

Пока пользователь обращается к save.php, мы представим форму с текстовым вводом, здесь пользователь должен будет указать метку в списке закладок, которые он или она хотели бы сохранить.

После предоставления метки мы будем хранить каждый список закладок в виде строки в базе данных (для последующего извлечения) и очищать текущий сеанс.

1
2
3
4
5
6
7
if(!$_POST[‘px-bookmark-list-name’]) :
    // Present form asking to give list a name
    // Stage 1
elseif($_POST[‘px-bookmark-list-name’]) :
    // Label supplied store to database.
    // Stage 2
endif;

Теперь на первом этапе save.php

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// If form submitted but no label supplied present error.
if($_POST[‘submit’] && !isset($_POST[‘px-bookmark-list-name’])) :
    echo ‘<p class=»error»>A label is required.</p>’;
endif;
 
// Establish the start counter
if($_SESSION[‘bookmarks’]) :
    foreach($_SESSION[‘bookmarks’] as $key => $value) :
        $keys[] = $key;
    endforeach;
    $start_count = min($keys);
endif;
 
// Loop over items and store in hidden form fields.
for($i = $start_count; $i < $start_count + count($_SESSION[‘bookmarks’]); $i++) :
    if($_SESSION[‘bookmarks’][$i] !== NULL) :
        $bookmark = get_post($_SESSION[‘bookmarks’][$i]);
        echo ‘<input type=»hidden» name=»px-post-url[]» value=»‘.$bookmark->post_name.’» />’;
        echo ‘<input type=»hidden» name=»px-post-name[]» value=»‘.$bookmark->post_title.’» />’;
        echo ‘<input type=»hidden» name=»px-post-id[]» value=»‘.$bookmark->ID.’» />’;
        echo ‘<input type=»submit» name=»submit» value=»Save List»>’;
    endif;
endfor;

Сначала мы отображаем ошибку, если метка не указана.

Далее мы используем ту же технику из widget.php и ajax.php, чтобы установить счетчик старта и перебрать данные сеанса.

Наконец, мы get_post некоторые поля формы с помощью get_post .

1
2
3
4
5
6
7
global $bp;
 
foreach($_POST[‘px-post-id’] as $value) :
    $posts_to_save[] = $value;
endforeach;
 
$posts = serialize($posts_to_save);

На втором этапе save.php мы получаем доступ к глобальному $bp .

Мы перебираем данные $_POST и сохраняем записи, которые будут сохранены в виде массива. Затем он сериализуется и сохраняется в переменной $posts .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
$list_name = $_POST[‘px-bookmark-list-name’];
 
$query = $wpdb->insert(
    ‘bookmarks’,
    array(
        ‘user_id’ => $bp->loggedin_user->id,
        ‘created’ => current_time(‘mysql’),
        ‘post_ids’ => $posts,
        ‘list_name’ => $list_name
    ),
    array(
        ‘%d’, // user_id
        ‘%s’, // created
        ‘%s’, // post_ids
        ‘%s’ // list_name
    )
);

Затем мы сохраняем метку, предоставленную пользователем для этого списка закладок, в переменную и используем WPDB для вставки строки в базу данных.

01
02
03
04
05
06
07
08
09
10
11
12
13
if($query) :
    echo ‘<div id=»message» class=»updated»>’;
    echo ‘<p>List saved.</p>’;
    echo ‘</div>’;
 
    session_start();
    session_unset();
    session_destroy();
else :
    echo ‘<div id=»message» class=»error»>’;
    echo ‘<p>There was an error.</p>’;
    echo ‘</div>’;
endif;

Наконец, мы проверяем, был ли запрос успешным, и сбрасывали данные сеанса, в противном случае отображаем ошибку.


Помните, что в view.php, когда никакое конкретное action не установлено, мы будем загружать loop.php . В этом файле $wpdb будет использоваться для получения и вывода любых списков закладок.

1
2
3
global $bp;
$displayed_user = $bp->displayed_user->id;
$bookmark_lists = $wpdb->get_results( «SELECT * FROM bookmarks WHERE user_id = $displayed_user ORDER BY id DESC»);

При использовании $bp global идентификатор отображаемого профиля сохраняется в переменной $displayed_user .

Затем мы выполняем запрос к таблице закладок с сохраненным $displayed_user в качестве условия where.

01
02
03
04
05
06
07
08
09
10
if($bookmark_lists) :
    foreach($bookmark_lists as $bookmark_list) :
        echo $bookmark_list->list_name;
        $post_ids = unserialize($bookmark_list->post_ids);
        foreach($post_ids as $post_id) :
            $bookmark = get_post($post_id);
            echo ‘<a href=»http://yoursite.com/’.$bookmark->post_name.’» title=»View bookmark»>’.$bookmark->post_title.'</a>’;
        endforeach;
    endforeach;
endif;

Когда результаты возвращаются, они отображаются путем циклического перебора данных и вывода соответственно. Здесь мы используем unserialize чтобы обратить вспять эффекты
serialize который использовался для хранения закладок ранее.

Удалить закладки

Мы можем сделать еще одно дополнение к предыдущему блоку кода.

1
2
3
if(is_user_logged_in() && bp_is_home()) :
    echo ‘<a href=»‘.$bp->displayed_user->domain.’?component=bookmarks&action=remove&id=’.$bookmark_list->id.’» class=»delete-list»>Delete list</a>’;
endif;

Это добавит привязку к заголовку каждого списка, который при нажатии передаст новое действие remove вместе с идентификатором списка закладок.

Что приводит нас к нашему последнему этапу … Удаление списка закладок. Откройте remove.php и давайте закончим.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
if(isset($_GET[‘action’]) == ‘remove’ && isset($_GET[‘id’])) :
    $list_id = $_GET[‘id’];
    global $bp;
    $user_id = $bp->loggedin_user->id;
    $query = $wpdb->query(«DELETE FROM bookmarks WHERE id = $list_id AND user_id = $user_id»);
     
    if($query) :
        echo ‘<div id=»message» class=»updated»>’;
        echo ‘<p>List deleted.</p>’;
        echo ‘</div>’;
    else :
        echo ‘<div id=»message» class=»error»>’;
        echo ‘<p>There was an error.</p>’;
        echo ‘</div>’;
    endif;
endif;

Сначала мы удостоверимся, что действие установлено на удаление, и есть идентификатор для создания небольшого запроса.

Далее мы храним некоторые пользовательские данные и запускаем запрос. Пользователи должны иметь возможность удалять только те списки, которые им принадлежат. Использование $bp->loggedin_user->id помогает нам достичь этого.

Наконец мы подаем сообщение в зависимости от результата.


В течение этого урока был применен ряд методов. Используя jQuery, сырой PHP, соглашения WordPress и BuddyPress, мы смогли проиллюстрировать замечательную функцию, которая будет добавлена ​​на ваш сайт социальной сети на платформе WordPress и BuddyPress.

В стандартной комплектации BuddyPress не поставляется с менеджером закладок, прикрепленным к профилям пользователей, и не существует плагина, который функционирует именно так.

Менеджер закладок является одним из примеров, но это может быть что угодно.

Основная цель этого урока состояла в том, чтобы показать, как быстро и эффективно вы можете продемонстрировать концепцию в стиле хай-джек BuddyPress.

С некоторыми ноу-хау это можно было бы собрать вечером без особых проблем. Временные обязательства ощутимы и могут быть учтены в ежемесячном контракте на техническое обслуживание

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

Данные не были подвергнуты санитарной обработке в этом учебном пособии, поэтому, пожалуйста, убедитесь, что если вы хотите поместить их в среду «реального мира», предварительно пройдите небольшую проверку .

Я надеюсь, что вам понравился этот урок, и если у вас есть какие-либо несоответствия, оставьте комментарий и сделаю все возможное, чтобы помочь вам пройти через него.