Работа с BuddyPress поверх WordPress — это супер захватывающая вещь, она добавляет платформе совершенно новое измерение и действительно демонстрирует огромный потенциал.
BuddyPress, как и другие плагины, расширяет основные функциональные возможности WordPress. Хотя для фрилансера или компании важно признать, что BuddyPress в отличие от других плагинов добавляет функциональность эпических пропорций.
Цель этого урока — показать вам, как быстро и функционально продемонстрировать подтверждение концепции, не совершая кардинальных грехов.
Вступление
В этом уроке мы будем использовать комбинацию функций PHP, jQuery и WordPress, чтобы расширить BuddyPress настолько, чтобы продемонстрировать концепцию.
Работая над профилями пользователей, мы без каких-либо средств добавим ссылку, позволяющую пользователям посещать область закладок участника.
Область закладок будет заполнена списком закладок, которые участник решил сохранить при просмотре любого сайта с поддержкой BuddyPress.
Область закладок, которые могут быть сохранены, будет применена только к постам WordPress, однако вы можете использовать эту возможность дальше и применить ее к другим областям веб-сайта на WordPress, который создает постоянную ссылку.
Шаг 1 Основы
Сегодня мы будем опираться на тему 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); 
 | 
Шаг 2 functions.php — Регистрация скрипта
Давайте продолжим и зарегистрируем файл 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 параметров. 
- Ручка — Дайте вашему сценарию имя.
 - Источник — путь к вашему сценарию.
 - Зависимости — какие сценарии понадобятся вашему сценарию для работы.
 - Версия — номер версии вашего скрипта.
 -   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 Виджет — подтверждение концепции

Теперь у нас есть ссылка, давайте создадим виджет, который будет постоянно отображаться на боковой панели и будет заполняться или очищаться по требованию.
Изображение выше отражает конечные состояния виджета в 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 определяет, какие кнопки и текст следует отображать рядом с виджетом, в зависимости от состояния текущего сеанса и 
  также, если пользователь вошел или вышел. 
Шаг 4 Добавление закладок через AJAX
  jQuery потрясающий, здесь мы будем использовать метод delegate и будем слушать клики на наших важных якорях.  Мы проверим наличие следующих пунктов. 
-   Якоря с классом 
add-bookmark -   Якоря с классом 
delete-bookmark -   Якоря с классом 
clear-bookmarks 
  Используя hasClass мы можем проверить, какой элемент был выбран в методе делегата, и hasClass требуемый вызов AJAX . 
Если вы собираетесь встроить это в более крупный проект, рассмотрите возможность использования шаблона pubsub .
var $ bookmark_widget = $ ('# px-bookmarks'), $ bookmark_form = $ ('# px-bookmarks form'), $ bookmark_widget_list = $ ('# px-bookmarks .current-bookmarks'), $ empty_widget = $ ('# px-bookmarks p'), $ widget_buttons = $ ('# px-bookmarks .widget-buttons'), $ login_notify = $ ('# px-bookmarks .login-notify'), // Это должно быть изменено, чтобы отразить ваш домен. $ ajax_path = 'http://yoursite.com/wp-content/themes/bookmark-theme/members/single/bookmarks/ajax.php';
Сначала запишите некоторые переменные, чтобы мы не слишком «плескались в DOM». Все селекторы DOM выше расположены в widget.php .
$ (". add-bookmark, .delete-bookmark, .clear-bookmarks"). делегат (this, 'click', function (e) { e.preventDefault (); });
  Мы сообщаем jQuery прослушивать щелчок по всем перечисленным классам, а через функцию обратного вызова мы сообщаем ему, что делать.  Следующие части кода, которые будут добавлены, будут размещены непосредственно после e.preventDefault() . 
  Использование preventDefault() — это более preventDefault() способ аннулировать действие по умолчанию, когда присутствует JavaScript.  Вот некоторые обсуждения, связанные с preventDefault() по переполнению стека . 
  Следующие части кода, которые будут добавлены, будут размещены непосредственно после e.preventDefault() . 
var $ post_id = $ (this) .data ('post-id'), $ post_name = $ (this) .data ('post-name'), $ post_href = $ (this) .attr ('href'), $ that = $ (this);
После того, как пользователь нажал на любую из «важных привязок», нам нужно сохранить значения атрибутов данных, которые были прикреплены к привязкам на шаге 2 . Это позволит нам отправлять и извлекать нужные нам данные.
  Следующий код может стать немного многословным, так как мы будем показывать и скрывать элементы, основанные на том, какой элемент был нажат, с этим предварительным курсором приведенный ниже код 
  Минимум, который будет функционировать без учета эстетики.  Однако, пожалуйста, загрузите исходный код и посмотрите на эти строки. 
if ($ that.hasClass ('add-bookmark')) { $ .Ajax ({ url: $ ajax_path + '? method = add', тип: 'GET', данные: 'post_id =' + $ post_id, success: function (returndata) { if ($ bookmark_widget_list.children (). length === 0) { // Показать спрятать } $ bookmark_widget_list.prepend ('<li id = "bookmark -' + $ post_id + '"> <a href="'+ $post_href +'"> '+ $ post_name +' </a> </ li> '); } }); }
  Здесь мы используем 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 ('delete-bookmark')) { $ .Ajax ({ url: $ ajax_path + '? method = delete', тип: 'GET', данные: 'post_id =' + $ post_id, success: function (returndata) { if ($ bookmark_widget_list.children (). length <= 1) { // Показать спрятать } $ ('# bookmark -' + $ post_id) .remove (); } }); }
  Как и в if($that.hasClass('add-bookmark')) здесь мы проверяем, нажали ли элементы, имеющие класс delete-bookmark . 
  Как только эта подпрограмма была введена, url в вызове AJAX слегка изменяется, посылая другую строку запроса.  А именно ?method=delete . 
Когда возвращается успешный ответ, мы удаляем этот элемент списка из текущих закладок, хранящихся в виджете.
  Применение некоторой логики таким же образом, как в подпрограмме add-bookmark чтобы определить, будет ли удаленный элемент последним.  На основании этого результата элементы DOM снова показываются или скрываются. 
if ($ that.hasClass ('clear-bookmarks')) { $ .Ajax ({ url: $ ajax_path + '? method = clear', success: function (returndata) { // Показать спрятать $ ('. postmetadata .delete-bookmark'). each (function (index) { // Список закладок очищен, по умолчанию якоря, прикрепленные к сообщениям. $ (this) .removeClass (). addClass ('add-bookmark'). html ('Добавить в закладки'); }); } }); }
  Последний фрагмент кода здесь используется для очистки всех закладок в виджете, установив для строки запроса url другой метод и сбросив любые привязки на странице по умолчанию «Добавить в закладки», чтобы отобразить пустой $_SESSION .  Это делается с помощью each method jQuery, чтобы найти все вхождения класса delete-bookmark (привязка, прикрепленная к сообщениям с помощью add_filter ) и переключением его на значение по умолчанию 
  add-bookmark . 
Шаг 5 PHP запрашивается через AJAX
Теперь мы создадим код 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 мы вызываем соответствующую функцию. 
Шаг 6 Закладки на профилях пользователей

Файлы, с которыми мы будем иметь дело до конца этого урока, перечислены ниже.
- 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; 
 | 
Наконец, мы проверяем, был ли запрос успешным, и сбрасывали данные сеанса, в противном случае отображаем ошибку.
Шаг 7 Получение и удаление закладок
  Помните, что в 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.
С некоторыми ноу-хау это можно было бы собрать вечером без особых проблем. Временные обязательства ощутимы и могут быть учтены в ежемесячном контракте на техническое обслуживание
Однако, если клиенту требуется больше функций из менеджера закладок, таких как виджет панели инструментов и более глубокие функции, вы бы вступили в сферу плагинов.
Данные не были подвергнуты санитарной обработке в этом учебном пособии, поэтому, пожалуйста, убедитесь, что если вы хотите поместить их в среду «реального мира», предварительно пройдите небольшую проверку .
Я надеюсь, что вам понравился этот урок, и если у вас есть какие-либо несоответствия, оставьте комментарий и сделаю все возможное, чтобы помочь вам пройти через него.