{"id":358518,"date":"2026-10-26T13:02:22","date_gmt":"2026-10-26T13:02:22","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/mm-book-catalog\/"},"modified":"2026-10-26T13:32:36","modified_gmt":"2026-10-26T13:32:36","slug":"montecchiani-book-catalog","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/montecchiani-book-catalog\/","author":15433105,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.3.1","stable_tag":"1.3.1","tested":"7.1.4","requires":"5.8","requires_php":"7.2","requires_plugins":null,"header_name":"Montecchiani Book Catalog","header_author":"Mirko Montecchiani","header_description":"Book catalog with a Book post type, genres, a responsive shortcode grid and one-click ISBN autofill from Google Books and Open Library.","assets_banners_color":"202038","last_updated":"2026-10-26 13:32:36","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/mirkomontecchiani\/WP-BookCatalog","header_author_uri":"https:\/\/github.com\/mirkomontecchiani","rating":0,"author_block_rating":0,"active_installs":0,"downloads":92,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.3.1":{"tag":"1.3.1","author":"mirkomontecchiani","date":"2026-10-26 13:32:36","revision":3766528}},"upgrade_notice":{"1.3.0":"<p>The plugin is now Montecchiani Book Catalog and the shortcode is renamed: replace\n    [books] and <code>[wpbc_books]<\/code> in your pages and posts with <code>[mbcat_books]<\/code>. Your books,\ngenres and settings are untouched.<\/p>","1.2.0":"<p>Fixes cover import from Google Books, ordering by year or author, the Default Author\nsetting, the uninstall cleanup and multisite activation. Recommended for everyone.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3766480,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3766480,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3766480,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3766480,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.3.1"],"block_files":[],"assets_screenshots":{"screenshot-1.jpg":{"filename":"screenshot-1.jpg","revision":3766480,"resolution":"1","location":"assets","locale":"","width":1345,"height":767},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3766480,"resolution":"2","location":"assets","locale":"","width":1345,"height":767},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3766480,"resolution":"3","location":"assets","locale":"","width":1345,"height":767},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3766480,"resolution":"4","location":"assets","locale":"","width":1345,"height":767}},"screenshots":{"1":"The catalog grid: the cover opens a panel with the book details, and the button below\nloads the rest of the catalog without reloading the page.","2":"Autofill from ISBN in the book editor: one click fills the empty fields from Google\nBooks and Open Library, and the cover found can be imported as the featured image.","3":"The books list in the admin, with the cover, author, year, ISBN and genre columns,\nsortable by author and by year.","4":"The settings page: default author, number of columns, which databases to query for the\nISBN autofill, and whether to delete everything on uninstall."}},"plugin_section":[],"plugin_tags":[268425,1779,13567,6858,1980],"plugin_category":[],"plugin_contributors":[288695],"plugin_business_model":[],"class_list":["post-358518","plugin","type-plugin","status-publish","hentry","plugin_tags-book-catalog","plugin_tags-books","plugin_tags-bookshelf","plugin_tags-isbn","plugin_tags-library","plugin_contributors-mirkomontecchiani","plugin_committers-mirkomontecchiani"],"banners":{"banner":"https:\/\/ps.w.org\/montecchiani-book-catalog\/assets\/banner-772x250.png?rev=3766480","banner_2x":"https:\/\/ps.w.org\/montecchiani-book-catalog\/assets\/banner-1544x500.png?rev=3766480","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/montecchiani-book-catalog\/assets\/icon-128x128.png?rev=3766480","icon_2x":"https:\/\/ps.w.org\/montecchiani-book-catalog\/assets\/icon-256x256.png?rev=3766480","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/montecchiani-book-catalog\/assets\/screenshot-1.jpg?rev=3766480","caption":"The catalog grid: the cover opens a panel with the book details, and the button below\nloads the rest of the catalog without reloading the page."},{"src":"https:\/\/ps.w.org\/montecchiani-book-catalog\/assets\/screenshot-2.png?rev=3766480","caption":"Autofill from ISBN in the book editor: one click fills the empty fields from Google\nBooks and Open Library, and the cover found can be imported as the featured image."},{"src":"https:\/\/ps.w.org\/montecchiani-book-catalog\/assets\/screenshot-3.png?rev=3766480","caption":"The books list in the admin, with the cover, author, year, ISBN and genre columns,\nsortable by author and by year."},{"src":"https:\/\/ps.w.org\/montecchiani-book-catalog\/assets\/screenshot-4.png?rev=3766480","caption":"The settings page: default author, number of columns, which databases to query for the\nISBN autofill, and whether to delete everything on uninstall."}],"raw_content":"<!--section=description-->\n<p>Montecchiani Book Catalog adds a dedicated <strong>Book<\/strong> content type to WordPress and displays your books\nanywhere on your site with the <code>[mbcat_books]<\/code> shortcode: a responsive 1\u20135 column grid of covers\nwith an overlay that reveals the book details on hover, on focus or on tap.<\/p>\n\n<p>Every book stores its own details (author, publisher, publication year, number of pages,\nlanguage, ISBN and an optional shop link), can be organised with the <strong>Genres<\/strong> taxonomy,\nand is automatically described with Schema.org <code>Book<\/code> structured data (JSON-LD) so search\nengines can show rich results.<\/p>\n\n<h4>ISBN autofill<\/h4>\n\n<p>Type an ISBN in the book editor and click <strong>Autofill from ISBN<\/strong>. The plugin queries the\nGoogle Books and Open Library catalogs and fills in the empty fields only \u2014 title, author,\npublisher, year, pages, language and description \u2014 never overwriting anything you already\nwrote. If a cover is found you can import it into the Media Library and set it as the\nfeatured image with one click.<\/p>\n\n<h4>Main features<\/h4>\n\n<ul>\n<li>Custom <strong>Book<\/strong> post type with cover, excerpt and full editor support (block editor ready)<\/li>\n<li><strong>Genres<\/strong> taxonomy to organise and filter the catalog<\/li>\n<li>Book fields: author, publisher, publication year, pages, language, ISBN, shop link<\/li>\n<li><strong>ISBN autofill<\/strong> from Google Books and Open Library, with the results merged and cached<\/li>\n<li><strong>Cover import<\/strong>: one click to store the cover in the Media Library as the featured image<\/li>\n<li><code>[mbcat_books]<\/code> shortcode with <code>columns<\/code>, <code>hitem<\/code>, <code>orderby<\/code>, <code>order<\/code> and <code>genre<\/code> attributes<\/li>\n<li>Responsive grid (1\u20135 columns), hover overlay, keyboard accessible, touch friendly<\/li>\n<li>\"Show All Books\" button that loads the rest of the catalog over AJAX<\/li>\n<li>Schema.org <code>Book<\/code> JSON-LD structured data for SEO<\/li>\n<li>Admin list columns for cover, author, year and ISBN, sortable by author and year<\/li>\n<li>Settings page: default author, author label, columns, ISBN data source, uninstall cleanup<\/li>\n<li>Fully translatable \u2014 French, Spanish, Italian and Japanese translations are prepared\nfor translate.wordpress.org, where any other language can be contributed too<\/li>\n<li>Assets are only loaded on the pages that actually use the shortcode<\/li>\n<\/ul>\n\n<h4>External services<\/h4>\n\n<p>This plugin can query two third-party book databases in order to autofill book details from\nan ISBN. Every request is made <strong>from your server, only inside the WordPress admin, and only\nwhen a logged-in editor clicks the \"Autofill from ISBN\" button or the \"Use as cover\"\nbutton<\/strong>. Nothing is ever sent from the public side of your site, no request is made\nautomatically or in the background, and no personal data about you or your visitors is\ntransmitted.<\/p>\n\n<p><strong>Google Books API<\/strong> \u2014 endpoint: <code>https:\/\/www.googleapis.com\/books\/v1\/volumes<\/code>\nWhat is sent, and when: the ISBN you typed, each time you click \"Autofill from ISBN\" (unless\nyou disabled this source in the settings) and, if the cached result of that lookup has expired\nin the meantime, again when you click \"Use as cover\". If you entered an optional Google Books\nAPI key in the plugin settings, that key is sent with the request too. Every request also\ncarries a <code>User-Agent<\/code> header identifying the plugin and its version\n(<code>Montecchiani-Book-Catalog\/1.3.1<\/code>); your site URL is not sent.\nWhen the answer includes a cover, your server also downloads its small thumbnail (a few\nkilobytes) from the address returned by the API, on <code>books.google.com<\/code> or its file host\n    books.googleusercontent.com, and embeds it in the editor as a preview: the editor page itself\nnever loads anything from Google. If you then click \"Use as cover\", the cover image file is\ndownloaded from the same address by your server and stored permanently in your site's Media\nLibrary.\nTerms of Service: https:\/\/developers.google.com\/books\/terms and\nhttps:\/\/policies.google.com\/terms\nPrivacy Policy: https:\/\/policies.google.com\/privacy<\/p>\n\n<p><strong>Open Library API (Internet Archive)<\/strong> \u2014 endpoint: <code>https:\/\/openlibrary.org\/api\/books<\/code>\nWhat is sent, and when: the ISBN you typed, each time you click \"Autofill from ISBN\" (unless\nyou disabled this source in the settings) and, if the cached result of that lookup has expired\nin the meantime, again when you click \"Use as cover\". Every request also carries a <code>User-Agent<\/code>\nheader identifying the plugin and its version (<code>Montecchiani-Book-Catalog\/1.3.1<\/code>); your site\nURL is not sent.\nWhen the answer includes a cover, your server also downloads its small thumbnail (a few\nkilobytes) from the address returned by the API, on <code>covers.openlibrary.org<\/code> (which may redirect\nto <code>archive.org<\/code>, the Internet Archive's file server), and embeds it in the editor as a preview:\nthe editor page itself never loads anything from Open Library. If you then click \"Use as cover\",\nthe cover image file is downloaded from the same address by your server and stored permanently\nin your site's Media Library.\nTerms of Use: https:\/\/archive.org\/about\/terms.php\nPrivacy Policy: https:\/\/archive.org\/about\/terms.php<\/p>\n\n<p>Please note that cover images downloaded from these services are third-party content: it is\nyour responsibility to check that you are allowed to publish them on your site.<\/p>\n\n<p>You can choose which of the two services is used \u2014 or use only one of them \u2014 in\n<strong>Book Catalog \u2192 Settings \u2192 ISBN Autofill<\/strong>. Lookup results and cover previews are cached on\nyour own server for 12 hours so that repeated lookups do not generate new outgoing requests.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>montecchiani-book-catalog<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install the plugin\nthrough the <strong>Plugins \u2192 Add New<\/strong> screen in WordPress.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> menu.<\/li>\n<li>Go to <strong>Book Catalog \u2192 Add New Book<\/strong> to create your first book.<\/li>\n<li>Add the <code>[mbcat_books]<\/code> shortcode to any page, post or block where you want the catalog.<\/li>\n<li>Optionally review <strong>Book Catalog \u2192 Settings<\/strong> to set the default author, the number of\ncolumns and the ISBN data source.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"how%20do%20i%20display%20the%20catalog%3F\"><h3>How do I display the catalog?<\/h3><\/dt>\n<dd><p>Add the <code>[mbcat_books]<\/code> shortcode to a page or post. Available attributes:<\/p>\n\n<ul>\n<li><code>columns<\/code> \u2014 number of columns, from 1 to 5 (defaults to the value in the settings)<\/li>\n<li><code>hitem<\/code> \u2014 show only this many books, with a \"Show All Books\" button underneath<\/li>\n<li><code>orderby<\/code> \u2014 <code>date<\/code>, <code>title<\/code>, <code>year<\/code>, <code>author<\/code>, <code>rand<\/code>, <code>menu_order<\/code> or <code>modified<\/code><\/li>\n<li><code>order<\/code> \u2014 <code>ASC<\/code> or <code>DESC<\/code><\/li>\n<li><code>genre<\/code> \u2014 one or more genre slugs, comma separated<\/li>\n<\/ul>\n\n<p>Example: <code>[mbcat_books hitem=\"6\" columns=\"3\" orderby=\"title\" order=\"ASC\" genre=\"fantasy,thriller\"]<\/code><\/p><\/dd>\n<dt id=\"does%20the%20isbn%20autofill%20overwrite%20what%20i%20already%20typed%3F\"><h3>Does the ISBN autofill overwrite what I already typed?<\/h3><\/dt>\n<dd><p>No. Only empty fields are filled in. The title and the description are only set when the\npost title and the editor are still empty.<\/p><\/dd>\n<dt id=\"do%20i%20need%20a%20google%20books%20api%20key%3F\"><h3>Do I need a Google Books API key?<\/h3><\/dt>\n<dd><p>No. Google Books answers without a key. A key only raises the request quota, which matters\nif you import a large number of books in a short time. You can add one in\n<strong>Book Catalog \u2192 Settings<\/strong>.<\/p><\/dd>\n<dt id=\"why%20did%20the%20cover%20import%20fail%3F\"><h3>Why did the cover import fail?<\/h3><\/dt>\n<dd><p>Not every ISBN has a cover scan in either database, and some records only carry a low\nresolution thumbnail. Try the other data source in the settings, or set the featured image\nmanually. Importing a cover requires a user who is allowed to upload files to the Media\nLibrary.<\/p><\/dd>\n<dt id=\"where%20does%20the%20plugin%20send%20my%20data%3F\"><h3>Where does the plugin send my data?<\/h3><\/dt>\n<dd><p>Only the ISBN you type is sent, and only to the services you enabled in the settings. See\nthe \"External services\" section above for the full details.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20my%20books%20if%20i%20delete%20the%20plugin%3F\"><h3>What happens to my books if I delete the plugin?<\/h3><\/dt>\n<dd><p>By default nothing is deleted: your books, genres and covers stay in the database. If you\nwant a full cleanup, tick <strong>Delete Data on Uninstall<\/strong> in <strong>Book Catalog \u2192 Settings<\/strong> before\ndeleting the plugin.<\/p><\/dd>\n<dt id=\"can%20i%20show%20more%20than%20500%20books%20at%20once%3F\"><h3>Can I show more than 500 books at once?<\/h3><\/dt>\n<dd><p>A single request renders at most 500 books, so a very large catalog cannot exhaust the PHP\nmemory limit. Developers can raise the limit with the <code>mbcat_max_books_per_request<\/code> filter.<\/p><\/dd>\n<dt id=\"which%20languages%20is%20the%20plugin%20available%20in%3F\"><h3>Which languages is the plugin available in?<\/h3><\/dt>\n<dd><p>English out of the box. Translations are delivered through translate.wordpress.org:\nFrench, Spanish, Italian and Japanese are being added there, and WordPress downloads a\ntranslation automatically as soon as it is available for your site's language, with no\nconfiguration.<\/p>\n\n<p>Any other language can be contributed on the plugin's translation project:\nhttps:\/\/translate.wordpress.org\/projects\/wp-plugins\/montecchiani-book-catalog\/<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.3.1<\/h4>\n\n<ul>\n<li>Fixed: the cover preview in the book editor was loaded by the browser straight from\nGoogle Books or Open Library. The preview is now downloaded by the server together with\nthe lookup and embedded in the response, so the editor never loads a file from a\nthird-party host.<\/li>\n<li>Changed: the cover import no longer accepts a URL from the browser. The server resolves\nthe cover from its own cached lookup of the ISBN, so the cover-host allowlist and the\n  mbcat_allowed_cover_hosts filter are gone.<\/li>\n<li>Changed: cover downloads are limited to 10 MB and previews to 128 KB.<\/li>\n<li>Privacy: the cover download no longer sends your site URL, which the default WordPress\n  User-Agent carried.<\/li>\n<li>Fixed: the Plugin URI pointed at a repository that does not exist.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>Changed: the plugin is now named Montecchiani Book Catalog. Post type, taxonomy,\nshortcode, options, transients, AJAX actions and every PHP symbol now carry the\n  mbcat prefix to rule out collisions with other plugins.<\/li>\n<li>Changed: the shortcode is <code>[mbcat_books]<\/code>. The former unprefixed <code>[books]<\/code> name\n(and its <code>[wpbc_books]<\/code> alias) registered a generic name that other plugins may\nlegitimately want.<\/li>\n<li>Changed: translation files are no longer bundled; translations are delivered\nautomatically through translate.wordpress.org.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Fixed: importing a cover from Google Books could never work. Those URLs carry no file\nextension, which <code>media_sideload_image()<\/code> rejects outright; covers are now downloaded\nfirst and typed from their actual content.<\/li>\n<li>Fixed: ordering by year or author sorted the books that had no value at all by an\nunrelated meta value, so their position was effectively random. Ordering now uses a\nsingle keyed LEFT JOIN; books without a value always come last.<\/li>\n<li>Fixed: the \"Default Author\" setting was written into a book's own meta the first time\nthe book was saved, so changing the setting later no longer affected existing books. It\nis now shown as a placeholder and resolved when the book is displayed.<\/li>\n<li>Fixed: the admin stylesheet restyled core WordPress tables and headings on every Book\nscreen. All admin styles are now scoped to the plugin's own markup.<\/li>\n<li>Fixed: uninstalling with \"Delete Data on Uninstall\" enabled left every genre behind and\nskipped books in the Trash, and it only cleaned the current site on multisite.<\/li>\n<li>Fixed: network-activating on multisite set up only one site, leaving the other sites\nwithout rewrite rules or settings. New sites are now set up automatically too.<\/li>\n<li>Fixed: the \"Show All Books\" button stopped working on sites with full-page caching once\nthe cached nonce expired. The endpoint is read-only and public, and no longer uses one.<\/li>\n<li>Fixed: the book details overlay was hidden from screen readers, and the non-linked cards\nwere focusable without any role. Publication year and page count could not be cleared.<\/li>\n<li>Fixed: submitting an array value for a book field could fatal on PHP 8.<\/li>\n<li>Security: importing a cover now also requires the <code>upload_files<\/code> capability, the host\nallowlist is matched case-insensitively and applied to the lookup response as well, and\ncover URLs are passed through <code>esc_url_raw()<\/code>.<\/li>\n<li>Privacy: the plugin no longer sends your site URL to Google Books \/ Open Library.<\/li>\n<li>Privacy: the Google Books API key is no longer rendered back into the settings page.<\/li>\n<li>Added: <code>[wpbc_books]<\/code>, a prefixed alias of the original <code>[books]<\/code> shortcode (both were\nreplaced by <code>[mbcat_books]<\/code> in 1.3.0).<\/li>\n<li>Added: a 500-book cap per request, adjustable with <code>mbcat_max_books_per_request<\/code>.<\/li>\n<li>Added: the <code>mbcat_shortcode_query_args<\/code>, <code>mbcat_allowed_cover_hosts<\/code> and <code>mbcat_lookup_data<\/code>\nfilters.<\/li>\n<li>Added: readme.txt, a bundled copy of the GPLv2 licence and a <code>.distignore<\/code>.<\/li>\n<li>Improved: the JSON-LD block is refreshed when \"Show All Books\" expands the catalog, and\nthe books admin list now shows the default author like the front end does.<\/li>\n<li>Added: French, Spanish and Japanese translations, alongside the existing Italian one.<\/li>\n<li>Removed: the manual <code>load_plugin_textdomain()<\/code> call, which WordPress has not needed\nsince 4.6.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Added ISBN autofill from Google Books and Open Library, with cover import.<\/li>\n<li>Added Schema.org Book structured data (JSON-LD).<\/li>\n<li>Added admin list columns for cover, author, year and ISBN, sortable by author and year.<\/li>\n<li>Added the Genres taxonomy filter to the shortcode.<\/li>\n<li>Added the settings page options for the ISBN data source and uninstall cleanup.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First release: Book post type, book fields, <code>[mbcat_books]<\/code> shortcode, responsive grid with\nhover overlay, \"Show All Books\" AJAX button, settings page and Italian translation.<\/li>\n<\/ul>","raw_excerpt":"Build a book catalog with a Book post type, genres, a responsive shortcode grid and one-click ISBN autofill from Google Books and Open Library.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/358518","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=358518"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/mirkomontecchiani"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=358518"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=358518"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=358518"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=358518"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=358518"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=358518"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}