Przejdź do głównej zawartości

Dokumentacja abilities

Abilities to atomowe działania, które Gratis AI Agent może wywoływać w Twojej instalacji WordPress. Każda ability jest zarejestrowaną klasą PHP, która udostępnia schemat JSON — agent odczytuje ten schemat w czasie działania, aby zrozumieć, jakie parametry są wymagane i co zwraca ability.

Ta strona dokumentuje wszystkie abilities dostarczane z Gratis AI Agent v1.9.0.


Niestandardowe typy wpisów

Te abilities zarządzają niestandardowymi typami wpisów (CPT) zarejestrowanymi przez agenta. Rejestracje są utrwalane w tabeli opcji WordPress, dzięki czemu przetrwają dezaktywację i ponowną aktywację pluginu.

register_post_type

Rejestruje nowy niestandardowy typ wpisu.

Parametry

ParametrTypWymaganeOpis
slugstringTakKlucz typu wpisu (maks. 20 znaków, bez wielkich liter, bez spacji)
singular_labelstringTakCzytelna dla człowieka nazwa w liczbie pojedynczej, np. Portfolio Item
plural_labelstringTakCzytelna dla człowieka nazwa w liczbie mnogiej, np. Portfolio Items
publicbooleanNieCzy typ wpisu jest publicznie dostępny. Domyślnie true
supportsarrayNieObsługiwane funkcje: title, editor, thumbnail, excerpt, comments, revisions, custom-fields. Domyślnie ["title","editor"]
has_archivebooleanNieCzy strona archiwum typu wpisu jest włączona. Domyślnie false
menu_iconstringNieKlasa Dashicons lub URL ikony menu administracyjnego. Domyślnie "dashicons-admin-post"
rewrite_slugstringNieSlug URL dla typu wpisu. Domyślnie slug

Przykład

{
"slug": "portfolio",
"singular_label": "Portfolio Item",
"plural_label": "Portfolio Items",
"public": true,
"supports": ["title", "editor", "thumbnail"],
"has_archive": true,
"menu_icon": "dashicons-portfolio"
}

Zwraca { "success": true, "slug": "portfolio" }


list_post_types

Zwraca wszystkie niestandardowe typy wpisów zarejestrowane przez agenta.

Parametry — brak

Zwraca

{
"post_types": [
{
"slug": "portfolio",
"singular_label": "Portfolio Item",
"plural_label": "Portfolio Items",
"public": true
}
]
}

delete_post_type

Wyrejestrowuje niestandardowy typ wpisu wcześniej zarejestrowany przez agenta. Istniejące wpisy tego typu pozostają w bazie danych, ale nie są już dostępne przez typ wpisu.

Parametry

ParametrTypWymaganeOpis
slugstringTakKlucz typu wpisu do usunięcia

Zwraca { "success": true, "slug": "portfolio" }


Niestandardowe taksonomie

Te abilities zarządzają niestandardowymi taksonomiami. Podobnie jak CPT, rejestracje taksonomii są utrwalane.

register_taxonomy

Rejestruje nową niestandardową taksonomię.

Parametry

ParametrTypWymaganeOpis
slugstringTakKlucz taksonomii (maks. 32 znaki)
singular_labelstringTakCzytelna dla człowieka nazwa w liczbie pojedynczej, np. Project Category
plural_labelstringTakCzytelna dla człowieka nazwa w liczbie mnogiej, np. Project Categories
post_typesarrayTakSlugi typów wpisów, do których ta taksonomia powinna być dołączona
hierarchicalbooleanNietrue dla stylu kategorii, false dla stylu tagów. Domyślnie true
publicbooleanNieCzy terminy są publicznie dostępne. Domyślnie true
rewrite_slugstringNieSlug URL dla taksonomii. Domyślnie slug

Przykład

{
"slug": "project-category",
"singular_label": "Project Category",
"plural_label": "Project Categories",
"post_types": ["portfolio"],
"hierarchical": true
}

Zwraca { "success": true, "slug": "project-category" }


list_taxonomies

Zwraca wszystkie niestandardowe taksonomie zarejestrowane przez agenta.

Parametry — brak

Zwraca

{
"taxonomies": [
{
"slug": "project-category",
"singular_label": "Project Category",
"post_types": ["portfolio"],
"hierarchical": true
}
]
}

delete_taxonomy

Wyrejestrowuje niestandardową taksonomię wcześniej zarejestrowaną przez agenta.

Parametry

ParametrTypWymaganeOpis
slugstringTakKlucz taksonomii do usunięcia

Zwraca { "success": true, "slug": "project-category" }


System projektowy

Abilities systemu projektowego modyfikują wizualną prezentację witryny WordPress — od niestandardowego CSS po wzorce bloków i logo witryny.

inject_custom_css

Dołącza CSS do <head> witryny za pomocą wp_add_inline_style. CSS jest przechowywany w opcji gratis_ai_agent_custom_css i poprawnie usuwany z kolejki, gdy ability zostanie zresetowana.

Parametry

ParametrTypWymaganeOpis
cssstringTakPoprawny CSS do wstrzyknięcia
labelstringNieCzytelna dla człowieka etykieta tego bloku CSS, używana w logach debugowania. Domyślnie "agent-injected"
replacebooleanNieJeśli true, zastępuje cały wcześniej wstrzyknięty CSS. Domyślnie false (dołącza)

Przykład

{
"css": ":root { --primary: #1a1a2e; --accent: #e94560; } body { font-family: 'Inter', sans-serif; }",
"label": "brand-colours",
"replace": false
}

Zwraca { "success": true, "bytes": 96 }


add_block_pattern

Rejestruje wielokrotnego użytku wzorzec bloku w bibliotece wzorców WordPress.

Parametry

ParametrTypWymaganeOpis
slugstringTakIdentyfikator wzorca, np. gratis/hero-dark
titlestringTakCzytelna dla człowieka nazwa wzorca wyświetlana w edytorze
contentstringTakSerializowany znacznik bloków (HTML) dla wzorca
categoriesarrayNieSlugi kategorii wzorców, np. ["featured", "hero"]
descriptionstringNieKrótki opis wyświetlany w selektorze wzorców
keywordsarrayNieSłowa kluczowe wyszukiwania

Zwraca { "success": true, "slug": "gratis/hero-dark" }


list_block_patterns

Wyświetla listę wszystkich wzorców bloków zarejestrowanych przez agenta.

Parametry — brak

Zwraca

{
"patterns": [
{
"slug": "gratis/hero-dark",
"title": "Dark Hero",
"categories": ["hero"]
}
]
}

Ustawia logo witryny WordPress na podane ID załącznika lub zdalny URL obrazu. Gdy podany jest URL, obraz jest pobierany i importowany do Biblioteki mediów.

Parametry

ParametrTypWymaganeOpis
attachment_idintegerNieID istniejącego załącznika w Bibliotece mediów
urlstringNieURL zdalnego obrazu do zaimportowania i ustawienia jako logo

Należy podać jedno z attachment_id albo url.

Zwraca { "success": true, "attachment_id": 42 }


apply_theme_json_preset

Stosuje nazwany preset kolorów/typografii do theme.json aktywnego motywu (lub global-styles). Presety to wyselekcjonowane pakiety utrzymywane przez zespół Gratis AI Agent.

Parametry

ParametrTypWymaganeOpis
presetstringTakNazwa presetu, np. minimal-dark, warm-editorial, corporate-blue
mergebooleanNieJeśli true, scal z istniejącymi wartościami zamiast je zastępować. Domyślnie false

Dostępne presety

PresetOpis
minimal-darkNiemal czarne tło, biały tekst, pojedynczy kolor akcentu
warm-editorialCiepłe złamane białe tło, nagłówki szeryfowe, ziemiste kolory akcentu
corporate-blueGranatowo-biała paleta z profesjonalną typografią
vibrant-startupJasne gradienty, zaokrąglone rogi, nowoczesny krój bezszeryfowy
classic-blogNeutralne szarości, wygodna wysokość linii, tradycyjne odstępy układu

Zwraca { "success": true, "preset": "minimal-dark" }


Style globalne

Możliwości stylów globalnych odczytują i zapisują wartości theme.json przez WordPress Global Styles API, wpływając na wszystkie bloki i szablony w całej witrynie.

get_global_styles

Zwraca bieżącą konfigurację stylów globalnych.

Parametry

ParametrTypWymaganeOpis
pathstringNieWskaźnik JSON do konkretnej wartości, np. /color/palette lub /typography/fontSizes. Zwraca cały obiekt, jeśli pominięto.

Zwraca pełny obiekt stylów globalnych lub wartość w path.


set_global_styles

Aktualizuje jedną lub więcej wartości w konfiguracji stylów globalnych.

Parametry

ParametrTypWymaganeOpis
pathstringTakWskaźnik JSON do wartości do ustawienia, np. /color/palette
valueanyTakNowa wartość

Przykład — dodaj kolor do palety

{
"path": "/color/palette",
"value": [
{ "slug": "primary", "color": "#1a1a2e", "name": "Primary" },
{ "slug": "accent", "color": "#e94560", "name": "Accent" }
]
}

Zwraca { "success": true, "path": "/color/palette" }


reset_global_styles

Resetuje wszystkie zastosowane przez agenta zmiany stylów globalnych, przywracając domyślne ustawienia motywu.

Parametry — brak

Zwraca { "success": true }


Możliwości menu nawigacyjnego tworzą menu nawigacyjne WordPress i ich elementy oraz nimi zarządzają.

create_menu

Tworzy nowe menu nawigacyjne WordPress.

Parametry

ParametrTypWymaganeOpis
namestringTakNazwa menu, np. Primary Navigation
locationstringNieLokalizacja motywu, do której przypisać to menu, np. primary

Zwraca { "success": true, "menu_id": 7 }


update_menu

Zmienia nazwę menu lub przypisuje je ponownie do lokalizacji motywu.

Parametry

ParametrTypWymaganeOpis
menu_idintegerTakID menu do aktualizacji
namestringNieNowa nazwa menu
locationstringNieLokalizacja motywu do przypisania lub ponownego przypisania

Zwraca { "success": true, "menu_id": 7 }


add_menu_item

Dodaje element do istniejącego menu nawigacyjnego.

Parametry

ParametrTypWymaganeOpis
menu_idintegerTakID docelowego menu
typestringTakTyp elementu: custom, post_type lub taxonomy
titlestringNieEtykieta elementu menu (wymagana dla typu custom)
urlstringNieURL dla elementów custom
object_idintegerNieID wpisu lub ID terminu dla elementów post_type/taxonomy
parent_idintegerNieID elementu menu, pod którym zagnieździć ten element
positionintegerNiePozycja w menu liczona od zera

Zwraca { "success": true, "item_id": 12 }


remove_menu_item

Usuwa element z menu nawigacyjnego.

Parametry

ParametrTypWymaganeOpis
item_idintegerTakID elementu menu do usunięcia

Zwraca { "success": true, "item_id": 12 }


list_menus

Wyświetla listę wszystkich menu nawigacyjnych WordPress, w tym przypisane im lokalizacje motywu.

Parametry — brak

Zwraca

{
"menus": [
{
"menu_id": 7,
"name": "Primary Navigation",
"location": "primary",
"item_count": 5
}
]
}

Zarządzanie opcjami

Możliwości opcji odczytują i zapisują opcje WordPress przez get_option / update_option. Wbudowana lista blokowania bezpieczeństwa zapobiega przypadkowej modyfikacji krytycznych ustawień.

get_option

Odczytuje opcję WordPress.

Parametry

ParametrTypWymaganeOpis
option_namestringTakKlucz opcji, np. blogname

Zwraca { "option_name": "blogname", "value": "My Site" }

Zwraca błąd, jeśli option_name znajduje się na liście blokowania bezpieczeństwa.


set_option

Zapisuje opcję WordPress.

Parametry

ParametrTypWymaganeOpis
option_namestringTakKlucz opcji
valueanyTakNowa wartość (serializowana automatycznie dla tablic/obiektów)
autoloadstringNie"yes" lub "no". Domyślnie zachowuje istniejące ustawienie autoload

Zwraca błąd, jeśli option_name znajduje się na bezpieczeństwa blocklist.

Zwraca { "success": true, "option_name": "blogname" }


delete_option

Usuwa opcję WordPress.

Parametry

ParameterTypeRequiredDescription
option_namestringYesKlucz opcji do usunięcia

Zwraca błąd, jeśli option_name znajduje się na bezpieczeństwa blocklist.

Zwraca { "success": true, "option_name": "my_custom_option" }


list_options

Wyświetla opcje WordPress pasujące do wzorca.

Parametry

ParameterTypeRequiredDescription
patternstringNoWzorzec SQL LIKE do filtrowania nazw opcji, np. gratis_%. Zwraca wszystkie opcje, jeśli pominięto (używaj ostrożnie w dużych bazach danych).
limitintegerNoMaksymalna liczba wyników. Domyślnie 50, maks. 500

Zwraca

{
"options": [
{ "option_name": "gratis_ai_agent_version", "autoload": "yes" }
],
"total": 1
}

Zarządzanie treścią

Możliwości zarządzania treścią tworzą i edytują wpisy oraz strony WordPress. ID wpisów są zwracane, aby kolejne kroki w planach obejmujących wiele możliwości mogły odwoływać się do utworzonej treści.

create_post

Tworzy nowy wpis WordPress, stronę lub pozycję niestandardowego typu wpisu.

Parametry

ParameterTypeRequiredDescription
titlestringYesTytuł wpisu
contentstringNoTreść wpisu — akceptuje zwykły tekst, HTML lub serializowane znaczniki bloków
statusstringNodraft, publish, pending, private. Domyślnie draft
post_typestringNoSlug typu wpisu, np. post, page lub dowolny zarejestrowany CPT. Domyślnie post
excerptstringNoKrótkie podsumowanie wyświetlane w archiwach i wynikach wyszukiwania
categoriesarrayNoTablica nazw lub ID kategorii do przypisania
tagsarrayNoTablica nazw lub ID tagów do przypisania
authorintegerNoID użytkownika WordPress do ustawienia jako autor wpisu. Domyślnie bieżący użytkownik
datestringNoData publikacji w formacie ISO 8601, np. 2026-05-01T09:00:00
page_templatestringNoPlik szablonu do przypisania do tego wpisu lub strony, np. page-full-width.php. Ma znaczenie tylko wtedy, gdy post_type to page lub CPT obsługujący szablony stron.

Przykład

{
"title": "Welcome to Our New Site",
"content": "<!-- wp:paragraph --><p>Hello world!</p><!-- /wp:paragraph -->",
"status": "publish",
"post_type": "page",
"page_template": "page-full-width.php"
}

Zwraca { "success": true, "post_id": 42, "permalink": "https://example.com/welcome/" }


update_post

Aktualizuje istniejący wpis lub stronę WordPress.

Parametry

ParameterTypeRequiredDescription
post_idintegerYesID wpisu do zaktualizowania
titlestringNoNowy tytuł wpisu
contentstringNoNowa treść wpisu
statusstringNoNowy status: draft, publish, pending, private
excerptstringNoNowy zajawka
categoriesarrayNoZastąp pełną listę kategorii tą tablicą nazw lub ID
tagsarrayNoZastąp pełną listę tagów tą tablicą nazw lub ID
page_templatestringNoNowy plik szablonu do przypisania do tego wpisu lub strony, np. page-full-width.php. Przekaż pusty ciąg, aby usunąć przypisanie szablonu i przywrócić domyślne ustawienie motywu.

Przykład — zmień szablon po utworzeniu

{
"post_id": 42,
"page_template": "page-full-width.php"
}

Zwraca { "success": true, "post_id": 42 }


batch_create_posts

Tworzy wiele wpisów w jednym wywołaniu możliwości, zmniejszając liczbę połączeń zwrotnych podczas budowania witryn lub masowego importu treści. Wpisy są tworzone sekwencyjnie; jeśli jeden się nie powiedzie, pozostałe są kontynuowane, a niepowodzenie jest zgłaszane w tablicy wyników.

Parametry

ParameterTypeRequiredDescription
postsarrayYesTablica obiektów wpisów, z których każdy akceptuje te same parametry co create_post
stop_on_errorbooleanNoJeśli true, zatrzymaj przetwarzanie po pierwszym niepowodzeniu. Domyślnie false

Przykład

{
"posts": [
{
"title": "About Us",
"post_type": "page",
"status": "publish",
"page_template": "page-full-width.php"
},
{
"title": "Services",
"post_type": "page",
"status": "publish"
},
{
"title": "Contact",
"post_type": "page",
"status": "publish"
}
]
}

Zwraca

{
"created": 3,
"failed": 0,
"results": [
{ "success": true, "post_id": 42, "title": "About Us" },
{ "success": true, "post_id": 43, "title": "Services" },
{ "success": true, "post_id": 44, "title": "Contact" }
]
}

set_featured_image

Przypisuje obrazek wyróżniający (miniaturę wpisu) do istniejącego wpisu lub strony. Akceptuje istniejący ID załącznika z Media Library albo zdalny URL obrazu; gdy podany jest URL, obraz jest automatycznie pobierany i importowany.

Parametry

ParameterTypeRequiredDescription
post_idintegerYesID wpisu lub strony do zaktualizowania
attachment_idintegerNoID istniejącego załącznika Media Library
urlstringNoZdalny URL obrazu do zaimportowania i ustawienia jako obrazek wyróżniający
alt_textstringNoTekst alternatywny do zastosowania do załącznika, jeśli zostanie zaimportowany z URL

Należy podać jedno z attachment_id lub url.

Zwraca { "success": true, "post_id": 42, "attachment_id": 17 }


create_contact_form

Tworzy formularz kontaktowy przy użyciu aktywnego plugin formularzy (Contact Form 7, WPForms, Fluent Forms lub Gravity Forms, zależnie od tego, który jest zainstalowany). Zwraca shortcode, który można osadzić w dowolnym wpisie lub na stronie.

Parametry

ParameterTypeRequiredDescription
titlestringYesNazwa formularza wyświetlana w panelu administracyjnym pluginu formularzy
fieldsarrayYesUporządkowana lista pól formularza (zobacz obiekt pola poniżej)
recipientstringNoAdres e-mail do otrzymywania zgłoszeń. Domyślnie adres e-mail administratora WordPress
subjectstringNoWiersz tematu e-maila. Obsługuje placeholdery [your-name] i [your-subject] podczas używania Contact Form 7
confirmation_messagestringNoKomunikat wyświetlany po pomyślnym przesłaniu. Domyślnie: "Thank you for your message. We'll be in touch soon."

Obiekt pola

KeyTypeRequiredDescription
namestringYesWewnętrzna nazwa pola / klucz maszynowy
labelstringYesCzytelna dla człowieka etykieta wyświetlana w formularzu
typestringYestext, email, tel, textarea, select, checkbox, radio, file, date
requiredbooleanNoCzy pole musi zostać wypełnione przed przesłaniem. Domyślnie false
optionsarrayNoOpcje dla pól select, checkbox i radio
placeholderstringNoTekst placeholdera dla danych wejściowych typu tekstowego

Przykład

{
"title": "Restaurant Booking Enquiry",
"fields": [
{ "name": "your-name", "label": "Name", "type": "text", "required": true },
{ "name": "your-email", "label": "Email", "type": "email", "required": true },
{ "name": "party-size", "label": "Party size", "type": "select", "options": ["1–2", "3–5", "6–10", "10+"] },
{ "name": "your-message", "label": "Special requests", "type": "textarea", "required": false }
],
"recipient": "[email protected]",
"subject": "New booking enquiry from [your-name]"
}

Zwraca

{
"success": true,
"form_id": 3,
"shortcode": "[contact-form-7 id=\"3\" title=\"Restaurant Booking Enquiry\"]"
}

Przegląd wizualny

Możliwości Przeglądu wizualnego pozwalają agentowi przechwytywać zrzuty ekranu działających stron i je analizować, umożliwiając autonomiczny przegląd projektu, porównania przed/po oraz kontrole regresji wizualnej bez wymagania żadnego rozszerzenia przeglądarki.

capture_screenshot

Przechwytuje zrzut ekranu strony WordPress pod podanym URL-em za pomocą serwerowej przeglądarki headless. Obraz jest zapisywany w Media Library i zwracany jest URL CDN.

Parametry

ParameterTypeRequiredDescription
urlstringYesPełny URL strony do zrzutu ekranu, np. https://example.com/about/
widthintegerNoSzerokość viewportu w pikselach. Domyślnie 1280
heightintegerNoWysokość viewportu w pikselach. Domyślnie 800
full_pagebooleanNoPrzechwyć pełną przewijaną stronę zamiast samego viewportu. Domyślnie false
delay_msintegerNoLiczba milisekund oczekiwania po załadowaniu strony przed przechwyceniem, przydatna dla animowanych treści. Domyślnie 500
labelstringNoCzytelna dla człowieka etykieta przechowywana z załącznikiem w Media Library

Zwraca

{
"success": true,
"attachment_id": 88,
"url": "https://example.com/wp-content/uploads/2026/04/screenshot-about.png",
"width": 1280,
"height": 800
}

compare_screenshots

Przyjmuje dwa zrzuty ekranu i zwraca wynik różnicy wizualnej oraz obraz różnic wyróżniający zmienione obszary. Przydatne do potwierdzania, że zmiana projektu przyniosła oczekiwany rezultat, lub do wykrywania niezamierzonych regresji.

Parametry

ParameterTypeRequiredDescription
before_urlstringYesURL strony do przechwycenia jako stan „przed”
after_urlstringYesURL strony do przechwycenia jako stan „po”. Może być tym samym URL-em, jeśli porównanie dotyczy różnych momentów w czasie
widthintegerNoSzerokość viewportu dla obu przechwyceń. Domyślnie 1280
thresholdfloatNoPróg różnicy pikseli (0,0–1,0). Piksele mieszczące się w tej tolerancji są uznawane za niezmienione. Domyślnie 0.1

Zwraca

{
"success": true,
"diff_score": 0.04,
"changed_pixels": 2340,
"total_pixels": 1024000,
"diff_attachment_id": 91,
"diff_url": "https://example.com/wp-content/uploads/2026/04/diff-about.png"
}

diff_score o wartości 0.0 oznacza brak widocznej zmiany; 1.0 oznacza zmianę każdego piksela.


review_page_design

Przechwytuje zrzut ekranu strony i wysyła go do modelu językowego w celu analizy wizualnej. Zwraca ustrukturyzowaną ocenę obejmującą układ, typografię, użycie kolorów i kwestie dostępności.

Parametry

ParameterTypeRequiredDescription
urlstringYesPełny URL strony do przeglądu
focusstringNoLista obszarów przeglądu rozdzielona przecinkami, które należy podkreślić: layout, typography, colour, accessibility, mobile. Domyślnie: wszystkie obszary
widthintegerNoSzerokość viewportu. Domyślnie 1280

Zwraca

{
"success": true,
"screenshot_url": "https://example.com/wp-content/uploads/2026/04/review-about.png",
"assessment": {
"overall": "The page structure is clean and readable. Two accessibility issues detected.",
"layout": "Good visual hierarchy. Hero section is prominent.",
"typography": "Body text is 15px — consider increasing to 16px for readability.",
"colour": "Contrast ratio on the CTA button (#fff on #4a90e2) is 3.1:1 — below the WCAG AA threshold of 4.5:1.",
"accessibility": ["Low contrast on CTA button", "Missing alt text on hero image"],
"suggestions": ["Darken the CTA button to #1a5cb0 to pass WCAG AA", "Add descriptive alt text to the hero image"]
}
}

Możliwości instalowalne

Rejestr możliwości instalowalnych pozwala rozszerzyć agenta o dodatkowe pakiety możliwości dystrybuowane jako pluginy WordPress. Każdy pakiet rejestruje jedną lub więcej możliwości przy użyciu standardowego API możliwości.

list_available_abilities

Zwraca katalog pakietów możliwości dostępnych do instalacji z rejestru.

Parametry

ParametrTypWymaganeOpis
categorystringNieFiltruj według kategorii: ecommerce, seo, media, social, developer

Zwraca

{
"packs": [
{
"slug": "gratis-ai-agent-woocommerce",
"name": "WooCommerce Abilities",
"category": "ecommerce",
"version": "1.0.0",
"abilities": ["create_product", "update_pricing", "manage_inventory"],
"installed": false
}
]
}

install_ability

Pobiera i aktywuje pakiet zdolności z rejestru.

Parametry

ParametrTypWymaganeOpis
slugstringTakslug pluginu pakietu zdolności

Zwraca { "success": true, "slug": "gratis-ai-agent-woocommerce", "abilities_added": 3 }


recommend_plugin

Odpytuje rejestr zdolności, aby znaleźć najlepszy plugin dla opisanego przypadku użycia i opcjonalnie go zainstalować.

Parametry

ParametrTypWymaganeOpis
descriptionstringTakOpis pożądanego działania w języku naturalnym
installbooleanNieJeśli true, natychmiast instaluje rekomendowany plugin. Domyślnie false

Przykład

{
"description": "I need a contact form with file upload support and spam protection",
"install": false
}

Zwraca

{
"recommendation": {
"slug": "contact-form-7",
"name": "Contact Form 7",
"reason": "Widely adopted, supports file uploads, and integrates with Akismet for spam filtering.",
"alternatives": ["wpforms-lite", "fluent-forms"]
}
}