Плагін WordPress. Виключаємо непотрібні категорії.

На сьогоднішній день, не дивлячись на всю критику на його адресу, движок WordPress залишається найбільш популярним серед блогерів. І одна з основних причин такої популярності - величезна кількість плагінів і готових тем оформлення.

Я не буду стверджувати, що створення полігонів для WP простий і інтуїтивно зрозумілий процес, але і назвати його надскладним я теж не можу. Є свої нюанси, до яких потрібно звикнути.

Цього разу я хочу розповісти про розробку нескладного плагіна, що дозволяє виключати записи з певних категорій з головної сторінки і з RSS стрічки.

Для чого це може знадобитися.

1) Ви ведете тематичний блог, але іноді любите писати просто про життя. За замовчуванням, на головної сторінки блогу можна переглянути останні номери записи. Відвідувач, потрапивши на ваш ресурс, в першу чергу, буде дивитися саме на них, і якщо вони йому не сподобаються, то навряд чи він стане гортати ваші архіви, сподіваючись знайти тематичну статтю.

2) Ви займаєтеся розміщенням платних статей. Тут взагалі все просто. Постійні читачі навряд чи оцінять seo'шную статтю про переваги чергового інтернет магазину 🙂 У той же час, монетизувати блог якось потрібно.

Повертаємося до реалізації.

Відразу даю посилання на архів

Source

UPD. Плагін оновлений для використання з WP 3.1.

Взагалі-то, я знайшов кілька готових плагінів зі схожою функціоналом. Але з різних причин вони мене не влаштували. Можливості деяких були явно надлишкові (для мене), інші працювали не зовсім так, як мені хотілося. Поетом я вирішив зробити свій варіант.

Установка і підключення точно такі ж, як і у більшості плагінів. Архів потрібно розпакувати в папку wp-content \ plugins та активувати в панелі у правління. Після цього в розділі Settings з'явиться сторінка з настройками плагіна.

Відзначаєте потрібні категорії, і вирішуєте де їх не потрібно показувати.

Тепер розберемо реалізацію плагіна.

Початок стандартне.

/ * Plugin Name: Exclude Category Plugin Plugin URI: https://www.simplecoding.org/plagin-wordpress-isklyuchaem-nenuzhnye-kategorii.html Description: Дозволяє прибрати пости зазначених категорій з головної сторінки і з RSS стрічки. Version: 1.0 Author: Statsenko Vladimir Author URI: https://www.simplecoding.org * /

Цей коментар містить дані, які відображаються на панелі управління плагінами.

Створення сторінки в панелі управління.

Нам потрібно виконати дві дії: створити новий пункт в меню Settings і створити форму з настройками плагіна.

Почнемо зі створення форми.

  1. <? Php
  2. function ec_settings_page () {
  3. // отримуємо список категорій
  4. $ Categories = get_categories (array ( 'hide_empty' => false));
  5. ?>
  6. <Div class = "wrap">
  7. <H2> Exclude Category Plugin Settings </ h2>
  8. <Form method = "post" action = "options.php">
  9. &lt;? Php
  10. // Необхідно для автоматичної обробки форми
  11. settings_fields ( 'ec-settings-group');
  12. ?>
  13. <Table class = "form-table">
  14. <Tbody>
  15. <Tr valign = "top">
  16. <Th scope = "row"> Виберіть категорії, які потрібно виключити </ th>
  17. <Td>
  18. <Fieldset>
  19. <Legend class = "screen-reader-text"> <span> Виберіть категорії, які потрібно виключити </ span> </ legend>
  20. &lt;? Php
  21. // читаємо значення поточний опції
  22. $ CurCL = get_option ( 'cats_list');
  23. foreach ($ categories as $ category) {
  24. $ Checked = '';
  25. if (is_array ($ curCL) && in_array ($ category-> cat_ID, $ curCL)) {
  26. $ Checked = 'checked = "checked"';
  27. }
  28. echo '<label> <input'. $ checked. ' type = "checkbox" name = "cats_list []" value = " '. $ category-> cat_ID.'" /> '. $ category-> name. '</ Label> <br />';
  29. }
  30. ?>
  31. </ Fieldset>
  32. </ Td>
  33. </ Tr>
  34. <Tr valign = "top">
  35. <Th scope = "row"> Чи не виводити вибрані категорії </ th>
  36. <Td>
  37. <Fieldset>
  38. <Legend class = "screen-reader-text"> <span> Чи не виводити вибрані категорії </ span> </ legend>
  39. &lt;? Php
  40. $ CurCH = get_option ( 'cats_home');
  41. $ CH = $ cF = '';
  42. if (is_array ($ curCH)) {
  43. $ CH = in_array ( 'home', $ curCH)? 'Checked = "checked"': '';
  44. $ CF = in_array ( 'feed', $ curCH)? 'Checked = "checked"': '';
  45. }
  46. ?>
  47. <Label> <input type = "checkbox" &lt;? Php echo $ cH; ?> Name = "cats_home []" value = "home" /> на головній </ label> <br />
  48. <Label> <input type = "checkbox" &lt;? Php echo $ cF; ?> Name = "cats_home []" value = "feed" /> в RSS стрічці </ label>
  49. </ Fieldset>
  50. </ Td>
  51. </ Tr>
  52. </ Tbody>
  53. </ Table>
  54. <P class = "submit"> <input type = "submit" class = "button-primary" value = "Зберегти" /> </ p>
  55. </ Form>
  56. </ Div>
  57. &lt;? Php
  58. }
  59. ?>

* This source code was highlighted with Source Code Highlighter .

Вийшла вона досить об'ємною, але в основному через розмітки. Коду зовсім небагато.

З розміткою форми ситуація наступна. За великим рахунком, вона може бути будь-хто. Але, якщо ви хочете, щоб ваша сторінка з настройками виглядала так само, як і решта адмінки, то, потрібно просто копіювати їх розмітку зі сторінок зі схожими формами. Що я і зробив.

Перед відображенням форми ми отримуємо список усіх посад за допомогою функції get_categories. Всередині форми створюємо групу чекбоксів для них. Атрибут name у цієї групи має значення cats_list [].

Друга група чекбоксів дозволяє вказати, звідки потрібно виключити записи. У неї атрибут name дорівнює cats_home [].

Тепер зверніть увагу на функцію settings_fields ( 'ec-settings-group'), яку ми викликаємо відразу після відкриття форми. Вона створює кілька прихованих полів, за допомогою яких автоматично виконується збереження даних, введених в форму.

Але для того, щоб ця можливість заробила необхідно зареєструвати обидва наших набору чекбоксів.

function register_ec_settings () {register_setting ( 'ec-settings-group', 'cats_list'); register_setting ( 'ec-settings-group', 'cats_home'); }

У першому параметрі функції register_setting передаємо ім'я групи (воно має збігатися з параметром, переданим settings_fields). У другому параметрі вказуємо атрибут name групи чекбоксів.

Тепер, при збереженні форми дані автоматично будуть записані в таблицю wp_options (при цьому виконується їх сериализация).

Отримати збережені дані можна за допомогою функції settings_fields. Що ми і робимо перед формуванням списку чекбоксів в формі. Перевірку, чи є поточна категорія серед обраних раніше, виконуємо за допомогою функції is_array.

Додаємо новий пункт в меню Settings

  1. // створюємо підміню Settings-> Exclude Category Plugin і відповідну форму
  2. // реєструємо функцію створення меню
  3. add_action ( 'admin_menu', 'ec_create_menu');
  4. // функція створення меню
  5. function ec_create_menu () {
  6. add_submenu_page ( 'options-general.php'
  7. , 'Exclude Category Plugin Settings'
  8. , 'Exclude Category'
  9. , 'Edit_plugins'
  10. , __FILE__
  11. , 'Ec_settings_page');
  12. // Реєструємо функцію register_ec_settings. Вона потрібна для автоматичної
  13. // обробки форми з настройками
  14. add_action ( 'admin_init', 'register_ec_settings');
  15. }

* This source code was highlighted with Source Code Highlighter .

Сам пункт створюється за допомогою функції add_submenu_page, в параметрах якій має бути вказано різні настройки. Перераховувати їх все я не буду, краще дам посилання на статтю з докладним описом . Але, зверніть увагу, що в останньому параметрі вказано ім'я функції, що створює форму.

Для того, щоб WP створив меню, потрібно додати дію (add_action). В її першому параметрі ми вказуємо назву дії в якому ми хочемо виконати наш код (в даному випадку це admin_menu), у другому параметрі - ім'я функції, яку потрібно виконати, саме в ній повинен бути виклик add_submenu_page. Крім того, в цій функції ми додаємо ще одну дію - admin_init, і в ньому реєструємо оброблювач register_ec_settings.

На даному етапі у нас є робоча форма в адмінки з двома наборами чекбоксів. Усі зазначені чекбокси зберігаються в базі даних (таблиця wp_options) і доступ до них можна отримати за допомогою get_option ( 'cats_home') і get_option ( 'cats_list').

Розглянемо принцип видалення постів.

Список посад движок WP отримує з бази даних за допомогою звичайного запиту. Тобто нам потрібно додати до цього запиту умови, які виключать непотрібні нам категорії.

Для цього, нам потрібно створити фільтр, який виконає наш код до відправки запиту движком. Робиться це в такий спосіб.

add_filter ( 'pre_get_posts', 'ec_exclude');

Подія pre_get_posts виникає якраз перед відправкою запиту, а ec_exclude - назва нашої функції, причому в першому її параметрі WP передасть об'єкт із запитом. Розглянемо її докладніше.

  1. function ec_exclude ($ query) {
  2. // читаємо масиви з опціями
  3. if (is_array ($ target = get_option ( 'cats_home'))) {
  4. if (is_array ($ categories = get_option ( 'cats_list'))) {
  5. // додаємо до id категорій знак "-"
  6. foreach ($ categories as $ i => $ category) {
  7. $ Categories [$ i] = '-'. $ Categories [$ i];
  8. }
  9. // формуємо рядок з переліком категорій
  10. $ Cat_string = implode ( ',', $ categories);
  11. // видаляємо пости зазначених категорій з RSS стрічки
  12. if (in_array ( 'feed', $ target) && $ query-> is_feed) {
  13. $ Query-> set ( 'cat', $ cat_string);
  14. }
  15. // видаляємо пости зазначених категорій з головної сторінки
  16. if (in_array ( 'home', $ target) && $ query-> is_home) {
  17. $ Query-> set ( 'cat', $ cat_string);
  18. }
  19. }
  20. }
  21. return $ query;
  22. }

* This source code was highlighted with Source Code Highlighter .

Виключити непотрібні категорії можна за допомогою методу set.
наприклад:

$ Query-> set ( 'cat', '-1, -2, -5');

Тут 1, 2, 5 - id категорій в БД, знак мінус означає, що категорії потрібно виключити.

Зверніть увагу. UPD. Плагін оновлений для використання з WP 3.1.
Тепер використовується параметр. Як значення передається вихідний архів з категоріями, які потрібно виключити

$ Query-> set ( 'category__not_in', $ categories);

У самій функції ec_exclude ми перевіряємо, чи вказані сторінки, з яких потрібно прибрати пости і список непотрібних категорій (за допомогою get_option ( 'cats_home') і get_option ( 'cats_list')).

Якщо ці опції встановлені, то формуємо рядок з id категорій $ cat_string і передаємо її методу set. При цьому з $ query-> is_home і допомогою $ query-> is_feed перевіряємо, яка сторінка в даний момент формується.

Не залежно від того, вносили ми зміни в запит чи ні, функція ec_exclude обов'язково повинна повернути об'єкт $ query, інакше сформувати сторінку не вийде.

Як бачите, логіка роботи плагіна досить проста, але додавання сторінок в адмінку трохи заплутане. З іншого боку, є багато досить хорошою документації і прикладів, і, в більшості випадків, їх можна легко адаптувати для своїх цілей.

Всі зауваження, запитання та пропозиції пишіть в коментарях. Постараюся відповісти 😉

Lt;?
Php echo $ cH; ?
Php echo $ cF; ?

Дополнительная информация

rss
Карта