{"id":30107080,"url":"https://github.com/benignware/wp-bootstrap-hooks","last_synced_at":"2025-08-10T01:33:03.643Z","repository":{"id":26246446,"uuid":"29693483","full_name":"benignware/wp-bootstrap-hooks","owner":"benignware","description":"A collection of filters and actions for Bootstrap-based themes","archived":false,"fork":false,"pushed_at":"2025-06-23T15:26:19.000Z","size":6785,"stargazers_count":7,"open_issues_count":4,"forks_count":3,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-06-23T16:37:56.328Z","etag":null,"topics":["wordpress-plugin"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/benignware.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2015-01-22T18:33:29.000Z","updated_at":"2025-06-23T15:26:22.000Z","dependencies_parsed_at":"2024-03-27T19:27:45.562Z","dependency_job_id":"cb7b4e72-b841-4281-9186-7d2b2e763748","html_url":"https://github.com/benignware/wp-bootstrap-hooks","commit_stats":null,"previous_names":[],"tags_count":101,"template":false,"template_full_name":null,"purl":"pkg:github/benignware/wp-bootstrap-hooks","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/benignware%2Fwp-bootstrap-hooks","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/benignware%2Fwp-bootstrap-hooks/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/benignware%2Fwp-bootstrap-hooks/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/benignware%2Fwp-bootstrap-hooks/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/benignware","download_url":"https://codeload.github.com/benignware/wp-bootstrap-hooks/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/benignware%2Fwp-bootstrap-hooks/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":269663307,"owners_count":24455801,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-09T02:00:10.424Z","response_time":111,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["wordpress-plugin"],"created_at":"2025-08-10T01:32:16.888Z","updated_at":"2025-08-10T01:33:03.605Z","avatar_url":"https://github.com/benignware.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# wp-bootstrap-hooks\n\nA collection of filters and actions for bootstrap-based themes\n\nWhen integrating [Bootstrap](http://getbootstrap.com/) with Wordpress, it is not sufficient to just include assets and add some css-classes to templates. You will also need to inject bootstrap-compatible markup into programmatically generated sections, such as menus, widgets, comments etc.\nBootstrap Hooks aims to cover most of these cases to make us immediately start implementing the individual application rather than getting hassled by markup incompatibilities.\n\nBootstrap Hooks consists of six separate modules for Navigation, Pagination, Forms, Widgets, Comments, Gallery and Blocks which can be used altogether or independently from each other. Every module is customizable by passing options to a central filter method.\n\nBootstrap Hooks has been optimized for Bootstrap 5, though it can be adjusted to also support older versions. See [Recipes](#recipes) for more details on how to do this.\n\n## Install\n\nInstall preferrably as a must-use plugin. It should be enabled by themes programmatically and updated by theme developers who maintain Bootstrap inside a certain themes.\n\n### Initialize\n\nBootstrap Hooks is made aware that your theme actually supports Bootstrap by calling `add_theme_support` in your `functions.php`:\n\n```php\nadd_theme_support( 'bootstrap' );\n```\n\n## Usage\n\nWith few exceptions, Bootstrap Hooks works out-of-the-box by injecting its magic via actions and filters. Read further to learn more about the distinct modules.\n\n### Content\n\nThe Content-Hook takes care of your post content primarily. It sets proper markup and classes to images, captions, blockquotes and tables. It also handles the post thumbnail to add the responsive image class.\n\nIn Bootstrap 4, the Tag-component may break Wordpress\\` default taxonomy styles. See [here](https://github.com/twbs/bootstrap/issues/20542) for reference.\nTo avoid undesired effects, the `tag` class is replaced with `post-tag` in `body_class`- or `post_class`-methods and also when it's found in the content.  \n\nThis module also provides a custom method to handle the edit-post-link.\nSearch your theme for occurrences of `edit_post_link` and replace with `wp_bootstrap_edit_post_link`:\n\n```php\n// Edit post link\nwp_bootstrap_edit_post_link(\n  sprintf(\n    /* translators: %s: Name of current post */\n    __( 'Edit\u003cspan class=\"screen-reader-text\"\u003e \"%s\"\u003c/span\u003e', 'textdomain' ),\n    get_the_title()\n  ),\n  '\u003cspan class=\"edit-link\"\u003e',\n  '\u003c/span\u003e'\n) );\n```\n\nWhen using Bootstrap Hooks as a plugin, you should definitely check if the method has been loaded by wrapping function call into a conditional `function_exists`-check. See the [Recipes](#recipes) section for an example.\n\n### Forms\n\nThis module handles search- and password-forms.\n\nA search-form is rendered as input-group.\nYou can customize the button's icon by passing arguments from a filter. This example shows how to integrate font-awesome:\n\n```php\n// Show Font-Awesome search icon in Searchform\nfunction my_bootstrap_options($options) {\n  return array_merge($options, array(\n    'search_submit_label' =\u003e '\u003ci class=\"fa fa-search\"\u003e\u003c/i\u003e'\n  ));\n}\nadd_filter( 'bootstrap_options', 'my_bootstrap_options' );\n```\n\n### Gallery\n\nThe gallery hook uses a grid of thumbnails in combination with a carousel inside a modal for zoom view.\n\nIn typical Bootstrap-driven layout, column sizes may differ from Wordpress default thumbnail size.\nYou may update thumbnail size to your needs in order to fit thumbnail images into at least three columns:\n\n```php\n// Adjust thumbnail size\nupdate_option( 'thumbnail_size_w', 230 );\nupdate_option( 'thumbnail_size_h', 230 );\nupdate_option( 'thumbnail_crop', 1 );\n```\n\nThe implementation does not handle different zoom-image heights. An easy way to fix this, is to register a custom image size with cropping enabled and apply to the gallery hook:\n\n```php\n// Register custom gallery image size\nadd_image_size( 'gallery-zoom', 900, 500, true );\n\n// Apply custom image size to gallery zoom\nfunction my_bootstrap_options($options) {\n  return array_merge($options, array(\n    'gallery_zoom_size' =\u003e 'gallery-zoom'\n  ));\n}\nadd_filter( 'bootstrap_options', 'my_bootstrap_options' );\n```\n\n\n### Menu\n\nBootstrap Hooks provides a custom MenuWalker based on the work by [Edward McIntyre](https://github.com/twittem/wp-bootstrap-navwalker) which is injected into menus per default.\nFor the menus being in primary or top location, the `navbar-nav`-class will automatically be added.\n\nBootstrap Hooks also adds a script that handles links on dropdown-toggles which are prevented by default from Bootstrap.\n\n### Pagination\n\nSince there's no existing hook for posts-pagination as well as for post-navigation, we need to call custom methods from our templates:\n\nSearch your theme for occurrences of `the_posts_pagination` and replace with `wp_bootstrap_posts_pagination`:\n\n```php\n// Previous/next page navigation.\nwp_bootstrap_posts_pagination( array(\n  'prev_text'          =\u003e __( 'Previous page', 'textdomain' ),\n  'next_text'          =\u003e __( 'Next page', 'textdomain' ),\n  'before_page_number' =\u003e '\u003cspan class=\"meta-nav screen-reader-text\"\u003e' . __( 'Page', 'textdomain' ) . ' \u003c/span\u003e'\n) );\n```\n\nSearch your theme for occurrences of `the_post_navigation` and replace with `wp_bootstrap_post_navigation`:\n\n```php\n// Previous/next post navigation.\nwp_bootstrap_post_navigation( array(\n  'next_text' =\u003e '\u003cspan class=\"meta-nav\" aria-hidden=\"true\"\u003e' . __( 'Next', 'textdomain' ) . '\u003c/span\u003e ' .\n    '\u003cspan class=\"screen-reader-text\"\u003e' . __( 'Next post:', 'textdomain' ) . '\u003c/span\u003e ' .\n    '\u003cspan class=\"post-title\"\u003e%title\u003c/span\u003e',\n  'prev_text' =\u003e '\u003cspan class=\"meta-nav\" aria-hidden=\"true\"\u003e' . __( 'Previous', 'textdomain' ) . '\u003c/span\u003e ' .\n    '\u003cspan class=\"screen-reader-text\"\u003e' . __( 'Previous post:', 'textdomain' ) . '\u003c/span\u003e ' .\n    '\u003cspan class=\"post-title\"\u003e%title\u003c/span\u003e'\n) );\n```\n\n\n### Widgets\n\nWidgets are rendered as cards. Some manipulations take care of content that's common to widgets, such as applying list-groups to unordered lists.\nMake sure that you registered any widget areas in your `functions.php`:\n\n```php\n// Register widget area.\nregister_sidebar( array(\n  'name'          =\u003e __( 'Widget Area', 'textdomain' ),\n  'id'            =\u003e 'sidebar-1',\n  'description'   =\u003e __( 'Add widgets here to appear in your sidebar.', 'textdomain' )\n) );\n```\n\n\n### Comments\n\nComments are rendered as nested media-objects.\n\nYou can customize the label 'Comment' by making use of the `bootstrap_options`-filter:\n\n```php\n// Customize Comment Label\nfunction my_bootstrap_options($args) {\n  return array_merge($args, array(\n    'comment_label' =\u003e ('Comment' , 'textdomain');\n  ));\n}\nadd_filter( 'bootstrap_options', 'my_bootstrap_options' );\n```\n\n\n## Recipes\n\n### Use as Plugin\n\nWhen intended to use as plugin or must-use plugin, you should also take care of the situation where the plugin is unistalled and check if any of the functions exist first:\n\n```php\n// Previous/next page navigation.\ncall_user_func_array(function_exists('wp_bootstrap_posts_pagination') ? 'wp_bootstrap_posts_pagination' : 'the_posts_pagination', array( array(\n  'prev_text'          =\u003e __( 'Previous page', 'textdomain' ),\n  'next_text'          =\u003e __( 'Next page', 'textdomain' ),\n  'before_page_number' =\u003e '\u003cspan class=\"meta-nav screen-reader-text\"\u003e' . __( 'Page', 'textdomain' ) . ' \u003c/span\u003e'\n) ) );\n\n// Previous/next post navigation.\ncall_user_func_array(function_exists('wp_bootstrap_post_navigation') ? 'wp_bootstrap_post_navigation' : 'the_post_navigation', array( array(\n  'next_text' =\u003e '\u003cspan class=\"meta-nav\" aria-hidden=\"true\"\u003e' . __( 'Next', 'textdomain' ) . '\u003c/span\u003e ' .\n    '\u003cspan class=\"screen-reader-text\"\u003e' . __( 'Next post:', 'textdomain' ) . '\u003c/span\u003e ' .\n    '\u003cspan class=\"post-title\"\u003e%title\u003c/span\u003e',\n  'prev_text' =\u003e '\u003cspan class=\"meta-nav\" aria-hidden=\"true\"\u003e' . __( 'Previous', 'textdomain' ) . '\u003c/span\u003e ' .\n    '\u003cspan class=\"screen-reader-text\"\u003e' . __( 'Previous post:', 'textdomain' ) . '\u003c/span\u003e ' .\n    '\u003cspan class=\"post-title\"\u003e%title\u003c/span\u003e'\n) ) );\n\n// Edit post link\ncall_user_func_array(function_exists('wp_bootstrap_edit_post_link') ? 'wp_bootstrap_edit_post_link' : 'edit_post_link', array(\n  sprintf(\n    /* translators: %s: Name of current post */\n    __( 'Edit\u003cspan class=\"screen-reader-text\"\u003e \"%s\"\u003c/span\u003e', 'textdomain' ),\n    get_the_title()\n  ),\n  '\u003cspan class=\"edit-link\"\u003e',\n  '\u003c/span\u003e'\n) );\n```\n\n### Bootstrap 3\n\nIf you're still working with [Bootstrap 3](http://getbootstrap.com/docs/3.3/), you need to override at least some options.\n\n```php\n// Bootstrap 3 Options\nfunction my_bootstrap_options($options) {\n  return array_merge($options, array(\n    'img_class' =\u003e 'img-responsive',\n    'align_center_class' =\u003e 'center-block',\n    'edit_post_link_class' =\u003e 'btn btn-default btn-xs',\n    'search_submit_label' =\u003e '\u003ci class=\"glyphicon glyphicon-search\"\u003e\u003c/i\u003e',\n    'gallery_thumbnail_class' =\u003e '',\n    'gallery_thumbnail_img_class' =\u003e 'img-thumbnail',\n    'close_button_class' =\u003e 'btn btn-default',\n    'carousel_item_class' =\u003e 'item',\n    'widget_class' =\u003e 'panel',\n    'widget_modifier_class' =\u003e 'panel-default',\n    'widget_header_class' =\u003e 'panel-heading',\n    'widget_content_class' =\u003e 'panel-block'\n  ));\n}\nadd_filter( 'bootstrap_options', 'my_bootstrap_options', 1 );\n```  \n\n## API\n\nBootstrap Hooks is highly customizable. That's mostly required because of managing different Bootstrap versions without splitting up the codebase. Normally there should be no need to change a lot.\n\n### Methods\n\n##### edit_post_link( string $text = null, string $before = '', string $after = '', int $id, string $class = 'post-edit-link' )\n\nDisplays the edit post link for post.\nSee [edit_post_link](https://developer.wordpress.org/reference/functions/edit_post_link/) for further details.\n\n##### wp_bootstrap_posts_pagination ( array $args = array() )\n\nDisplays a paginated navigation to next/previous set of posts, when applicable.\nSee [the_posts_pagination](https://developer.wordpress.org/reference/functions/the_posts_pagination/) for further details.\n\n##### wp_bootstrap_post_navigation ( array $args = array() )\n\nDisplays the navigation to next/previous post, when applicable.\nSee [the_post_navigation](https://developer.wordpress.org/reference/functions/the_post_navigation/) for further details.\n\n### Filters\n\n##### bootstrap_options ( array $options = array() )\n\nInject custom options.\n\n### Options\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003cth\u003eName\u003c/th\u003e\n    \u003cth\u003eDescription\u003c/th\u003e\n    \u003cth\u003eDefault\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003efield_class\u003c/td\u003e\n    \u003ctd\u003eSets the field class used in forms\u003c/td\u003e\n    \u003ctd\u003eform-group\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003etext_input_class\u003c/td\u003e\n    \u003ctd\u003eSets the text input class used in forms\u003c/td\u003e\n    \u003ctd\u003eform-control\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003esubmit_class\u003c/td\u003e\n    \u003ctd\u003eSets submit button css class\u003c/td\u003e\n    \u003ctd\u003ebtn btn-primary\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003ereply_link_class\u003c/td\u003e\n    \u003ctd\u003eSet reply link css class\u003c/td\u003e\n    \u003ctd\u003ebtn btn-primary btn-xs\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003ecomment_label\u003c/td\u003e\n    \u003ctd\u003eSets the comment label\u003c/td\u003e\n    \u003ctd\u003eComment\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eimg_class\u003c/td\u003e\n    \u003ctd\u003eSets the general image class used in content and thumbnails\u003c/td\u003e\n    \u003ctd\u003eimg-responsive\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003ealign_left_class\u003c/td\u003e\n    \u003ctd\u003eAligns an image to left\u003c/td\u003e\n    \u003ctd\u003epull-left\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003ealign_right_class\u003c/td\u003e\n    \u003ctd\u003eAligns an image to right\u003c/td\u003e\n    \u003ctd\u003epull-right\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003ealign_center_class\u003c/td\u003e\n    \u003ctd\u003eCenter an image\u003c/td\u003e\n    \u003ctd\u003emx-auto\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eimg_caption_tag\u003c/td\u003e\n    \u003ctd\u003eSets the tag for the img caption element\u003c/td\u003e\n    \u003ctd\u003efigure\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eimg_caption_class\u003c/td\u003e\n    \u003ctd\u003eSets the css class for the img caption element\u003c/td\u003e\n    \u003ctd\u003efigure\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eimg_caption_text_tag\u003c/td\u003e\n    \u003ctd\u003eSets the tag for the img caption text element\u003c/td\u003e\n    \u003ctd\u003efigcaption\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eimg_caption_text_class\u003c/td\u003e\n    \u003ctd\u003eSets the css class for the img caption text element\u003c/td\u003e\n    \u003ctd\u003efigure-caption\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eimg_caption_img_class\u003c/td\u003e\n    \u003ctd\u003eSets the css class for the image of the img element of the caption\u003c/td\u003e\n    \u003ctd\u003efigure-img\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003etable_class\u003c/td\u003e\n    \u003ctd\u003eSets the table css class\u003c/td\u003e\n    \u003ctd\u003etable\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003etable_container_tag\u003c/td\u003e\n    \u003ctd\u003eSets the table container tag\u003c/td\u003e\n    \u003ctd\u003ediv\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003etable_container_class\u003c/td\u003e\n    \u003ctd\u003eSets the table container class\u003c/td\u003e\n    \u003ctd\u003etable-responsive\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eblockquote_class\u003c/td\u003e\n    \u003ctd\u003eSets the blockquote css class\u003c/td\u003e\n    \u003ctd\u003eblockquote\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eblockquote_footer_tag\u003c/td\u003e\n    \u003ctd\u003eSets the blockquote footer tag\u003c/td\u003e\n    \u003ctd\u003efooter\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eblockquote_footer_class\u003c/td\u003e\n    \u003ctd\u003eSets the blockquote footer css class\u003c/td\u003e\n    \u003ctd\u003eblockquote-footer\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eedit_post_link_class\u003c/td\u003e\n    \u003ctd\u003eSets the edit post link css class\u003c/td\u003e\n    \u003ctd\u003ebtn btn-secondary\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eedit_post_link_container_class\u003c/td\u003e\n    \u003ctd\u003eSets the edit post link container css class\u003c/td\u003e\n    \u003ctd\u003eform-group btn-group btn-group-sm\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003esearch_submit_label\u003c/td\u003e\n    \u003ctd\u003eSets the searchfield's submit label\u003c/td\u003e\n    \u003ctd\u003e\u003ci\u003e🔎\u003c/i\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003etext_input_class\u003c/td\u003e\n    \u003ctd\u003eSets the class of textfields used in search- and password-forms\u003c/td\u003e\n    \u003ctd\u003eform-control\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003esubmit_button_class\u003c/td\u003e\n    \u003ctd\u003eSets the class of submit buttons used in search- and password-forms\u003c/td\u003e\n    \u003ctd\u003ebtn btn-primary\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003egallery_thumbnail_size\u003c/td\u003e\n    \u003ctd\u003eSets the default thumbnail size\u003c/td\u003e\n    \u003ctd\u003ethumbnail\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003egallery_thumbnail_class\u003c/td\u003e\n    \u003ctd\u003eSets the default thumbnail size\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003egallery_thumbnail_img_class\u003c/td\u003e\n    \u003ctd\u003eSets the default thumbnail size\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003egallery_zoom_size\u003c/td\u003e\n    \u003ctd\u003eSets the image size for the carousel view\u003c/td\u003e\n    \u003ctd\u003elarge\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eclose_button_class\u003c/td\u003e\n    \u003ctd\u003eSets the modal's close button class\u003c/td\u003e\n    \u003ctd\u003ebtn btn-secondary\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eclose_button_label\u003c/td\u003e\n    \u003ctd\u003eSets the modal's close button label\u003c/td\u003e\n    \u003ctd\u003e__('Close')\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003ecarousel_item_class\u003c/td\u003e\n    \u003ctd\u003eSets the carousel's item class\u003c/td\u003e\n    \u003ctd\u003e_item\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003emenu_item_class\u003c/td\u003e\n    \u003ctd\u003eSets the menu item class\u003c/td\u003e\n    \u003ctd\u003enav-item\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003emenu_item_link_class\u003c/td\u003e\n    \u003ctd\u003eSets the menu item link class\u003c/td\u003e\n    \u003ctd\u003enav-link\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003esub_menu_tag\u003c/td\u003e\n    \u003ctd\u003eSets the sub menu tag\u003c/td\u003e\n    \u003ctd\u003eul\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003esub_menu_class\u003c/td\u003e\n    \u003ctd\u003eSets the sub menu class\u003c/td\u003e\n    \u003ctd\u003edropdown-menu\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003esub_menu_header_class\u003c/td\u003e\n    \u003ctd\u003eSets the sub menu class\u003c/td\u003e\n    \u003ctd\u003edropdown-header\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003esub_menu_item_tag\u003c/td\u003e\n    \u003ctd\u003eSets the sub menu item tag\u003c/td\u003e\n    \u003ctd\u003eli\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003esub_menu_item_class\u003c/td\u003e\n    \u003ctd\u003eSets the sub menu item class\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003esub_menu_item_link_class\u003c/td\u003e\n    \u003ctd\u003eSets the sub menu header class\u003c/td\u003e\n    \u003ctd\u003edropdown-item\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003ecaret\u003c/td\u003e\n    \u003ctd\u003eSets the menu item caret class (bs \u003c 5)\u003c/td\u003e\n    \u003ctd\u003e\u0026lt;span class=\u0026quot;caret\u0026quot;\u0026gt;\u0026lt;/span\u0026gt;\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epagination_class\u003c/td\u003e\n    \u003ctd\u003eSets the pagination class\u003c/td\u003e\n    \u003ctd\u003epagination\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epage_item_class\u003c/td\u003e\n    \u003ctd\u003eSets the page item class\u003c/td\u003e\n    \u003ctd\u003epage-item\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epage_item_active_class\u003c/td\u003e\n    \u003ctd\u003eSets the page item active class\u003c/td\u003e\n    \u003ctd\u003eactive\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epage_link_class\u003c/td\u003e\n    \u003ctd\u003eSets the page link css class\u003c/td\u003e\n    \u003ctd\u003epage-link\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epost_nav_class\u003c/td\u003e\n    \u003ctd\u003eSets the post navigation class\u003c/td\u003e\n    \u003ctd\u003enav\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epost_nav_tag\u003c/td\u003e\n    \u003ctd\u003eSets the post navigation tag\u003c/td\u003e\n    \u003ctd\u003eul\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epost_nav_item_class\u003c/td\u003e\n    \u003ctd\u003eSets the post navigation item class\u003c/td\u003e\n    \u003ctd\u003enav-item\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epost_nav_item_tag\u003c/td\u003e\n    \u003ctd\u003eSets the post navigation item tag\u003c/td\u003e\n    \u003ctd\u003eli\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epost_nav_link_class\u003c/td\u003e\n    \u003ctd\u003eSets the post navigation link class\u003c/td\u003e\n    \u003ctd\u003enav-link\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epaginated_class\u003c/td\u003e\n    \u003ctd\u003eSets the paginated class\u003c/td\u003e\n    \u003ctd\u003epagination pagination-sm\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epaginated_tag\u003c/td\u003e\n    \u003ctd\u003eSets the paginated tag\u003c/td\u003e\n    \u003ctd\u003eul\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epaginated_item_class\u003c/td\u003e\n    \u003ctd\u003eSets the paginated item class\u003c/td\u003e\n    \u003ctd\u003epage-item\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epaginated_item_tag\u003c/td\u003e\n    \u003ctd\u003eSets the paginated item tag\u003c/td\u003e\n    \u003ctd\u003eli\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epaginated_link_class\u003c/td\u003e\n    \u003ctd\u003eSets the paginated link tag\u003c/td\u003e\n    \u003ctd\u003epage-link\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003enext_posts_link_class\u003c/td\u003e\n    \u003ctd\u003eSpecify next posts link class\u003c/td\u003e\n    \u003ctd\u003ebtn btn-sm btn-secondary\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eprevious_posts_link_class\u003c/td\u003e\n    \u003ctd\u003eSpecify previous posts link class\u003c/td\u003e\n    \u003ctd\u003ebtn btn-sm btn-secondary\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003ewidget_class\u003c/td\u003e\n    \u003ctd\u003eSets the widget class\u003c/td\u003e\n    \u003ctd\u003ecard\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003ewidget_modifier_class\u003c/td\u003e\n    \u003ctd\u003eSets the widget modifier class\u003c/td\u003e\n    \u003ctd\u003ecard-widget\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003ewidget_header_class\u003c/td\u003e\n    \u003ctd\u003eSets the widget header class\u003c/td\u003e\n    \u003ctd\u003ecard-header\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003ewidget_content_class\u003c/td\u003e\n    \u003ctd\u003eSets the widget content class\u003c/td\u003e\n    \u003ctd\u003ecard-body\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\n## Development\n\nDownload [Docker CE](https://www.docker.com/get-docker) for your OS.\nDownload [NodeJS](https://nodejs.org) for your OS.\n\n### WordPress\n\nRun container. Point your browser to [http://localhost:8020](http://localhost:8020).\n\n```shell\ndocker-compose up -d\n```\n\nImport test data. Activate wordpress-importer if needed.\n\n```shell\ndocker compose run wp plugin activate wordpress-importer\ndocker compose run wp import vendor/wptrt/theme-unit-test --authors=skip\n```\n\nUpdate composer dependencies\n\n```shell\ndocker-compose run composer update\n```\n\nStop all globally running docker containers\n\n```shell\ndocker stop $(docker ps -a -q)\n```\n\n\n### Frontend\n\nInstall front-end dependencies\n\n```shell\nnpm i\n```\n\nWatch front-end dependencies\n\n```shell\nnpm run watch\n```\n\nCreate a build for production\n\n```shell\nnpm run build\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbenignware%2Fwp-bootstrap-hooks","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbenignware%2Fwp-bootstrap-hooks","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbenignware%2Fwp-bootstrap-hooks/lists"}