Breadcrumb NavXT and Bootstrap 4 Breadcrumb

Out of the box Breadcrumb NavXT generates markup that is ready for Schema.org BreadcrumbList compliance. While this is great for most cases, for users of frameworks, some markup changes may be desireable. This article looks at what is necessary to get Breadcrumb NavXT to generate markup compliant with Bootstrap 4’s Breadcrumb component.

The Code

To generate Bootstrap 4 breadcrumb compliant markup, two bits of code are needed. The first is the appropriate calling code (including the proper wrapping markup). Place the following calling code in the appropriate theme file(s) (usually header.php):

<?php if(function_exists('bcn_display_list')):?>
<nav class="breadcrumbs" typeof="BreadcrumbList" vocab="https://schema.org/" aria-label="breadcrumb">
    <ol class="breadcrumb">
        <?php bcn_display_list();?>
    </ol>
</nav>
<?php endif; ?>

The second bit of code goes into a site specific plugin:

add_filter('bcn_display_attributes', my_display_attributes_filter, 10, 3);
function my_display_attributes_filter($attribs, $types, $id)
{
    $extra_attribs = array('class' => array('breadcrumb-item'));
    //For the current item we need to add a little more info
    if(is_array($types) && in_array('current-item', $types))
    {
        $extra_attribs['class'][] = 'active';
        $extra_attribs['aria-current'] = array('page');
    }
    $atribs_array = array();
    preg_match_all('/([a-zA-Z]+)=["\']([a-zA-Z0-9\-\_ ]*)["\']/i', $attribs, $matches);
    if(isset($matches[1]))
    {
        foreach ($matches[1] as $key => $tag)
        {
            if(isset($matches[2][$key]))
            {
                $atribs_array[$tag] = explode(' ', $matches[2][$key]);
            }
        }
    }
    $merged_attribs = array_merge_recursive($atribs_array , $extra_attribs);
    $output = '';
    foreach($merged_attribs as $tag => $vals)
    {
        $output .= sprintf(' %1$s="%2$s"', $tag, implode(' ', $vals));
    }
    return $output;
}

This code adds the breadcrumb-item to every breadcrumb in the trail. Additionally it adds the active class and the arria-current attribute to the current item. While the first could be easily achieved by updating every Breadcrumb template, this solution is easier to implement and allows us to use bcn_display_list().

Unfortunately, the bcn_display_attributes filter available since Breadcrumb NavXT 6.0 is not the easiest use in an efficient and robust manner. In the future a new filter will be added to address this deficiency. As presented, my_display_attributes_filter will be greatly simplified with said new filter (lines 11-22 and 24-28 go away). This article will be updated at that time to reflect the changes in API.

-John Havlik

[end of transmission, stay tuned]

2 Comments Updated:

Fix Bluetooth Mouse Pairing but not Moving Cursor in Linux

I recently picked up a Logitech M585 to replace my old M577 which was randomly registering multiple clicks for each left click. This was the second button to go bad on that mouse so it was time for an upgrade (the back click action on the mouse wheel had gone out a year back).

While I had no problems pairing the M585 with my laptop running Linux, it was not moving the cursor and mouse clicks were not registering. This is not the first mouse that I’ve had issues with on this laptop, the Microsoft Bluetooth Mobile Mouse 3600 exhibited a similar behavior. Checking the system logs, I found the following clue:

[bluetoothd] input-hog profile accept failed for XX:XX:XX:XX:XX:XX

Where XX:XX:XX:XX:XX:XX is the bluetooth address for the mouse. After some digging, I came across the solution. CONFIG_UHID needs to be set to ‘y’ in the kernel config to enable userspace I/O driver support for the HID subsystem.

CONFIG_UHID=y

After making this change, recompiling the kernel and rebooting the M585 pairs and works properly as a mouse. Additionally, the MS Bluetooth Mobile Mouse 3600 now works properly as well.

-John Havlik

[end of transmission, stay tuned]

Breadcrumb NavXT 6.2.1

This is the first, and hopefully only, bug fix release of the 6.2 branch of Breadcrumb NavXT. One bug was fixed in this release. In 6.2.0 changes introduced into the default settings handling code for Custom Post Types contained a bug relating to the handling of hierarchical CPTs. This bug manifested itself as PHP warnings on the frontend, on the settings page, and as “the following settings were not saved” messages in the settings page.

Additionally, the default template for unlinked breadcrumbs has been modified to include a span element wrapping the title. This makes the markup of the individual breadcrumbs consistent in that they are wrapped in a span element.

As always, you can grab the latest version of Breadcrumb NavXT from the Breadcrumb NavXT page. If you experience any issues with this version of Breadcrumb NavXT, please leave a comment on this post detailing the issue.

-John Havlik

[end of transmission, stay tuned]

Breadcrumb NavXT 6.2.0

Holy pre-Gutenberg Block introduction release Batman! Originally, 6.2 was to contain a Gutenberg Block, however it did not make the release. New in 6.2 are two filters (bcn_register_rest_endpoint and bcn_breadcrumb_assemble_json_ld_array), and support for following a primary (post parent hierarchy) and then secondary hierarchy (specified in the Hierarchy option for the post type).

A few bug fixes were included in this release. A bug preventing the settings reset option under the help drop down from working was fixed. A cause of PHP warnings to show up on the custom post type and custom taxonomy settings immediately after upgrading/migrating the settings to a new version was fixed.

Several behavior changes were made in this release. The biggest involves the REST API endpoints no longer being enabled by default. Additionally, the default templates were changed for two reasons. The first was to simplify and clarify the translatable content. The second was to improve Schema.org BreadcrumbList compatibility. As part of these changes, the default unlinked breadcrumb templates no longer contain span elements, or any Schema.org BreadcrumbList markup. This fixes an issue seen in the Google Structured Data Testing Tool.

REST API Changes

As introduced in 6.1, the REST API was enabled by default. In 6.2, this changes. Now, individual Breadcrumb NavXT REST API endpoints must be requested via the newly introduced bcn_register_rest_endpoint filter. This provides a method for plugins using the Breadcrumb NavXT REST API to request and expose only the endpoints that are needed. Note that the BCN_DISABLE_REST_API constant can still disable the Breadcrumb NavXT REST API and takes priority over the new filter.

These changes were made in an effort to decrease the attack surface of Breadcrumb NavXT and were prompted by concerns raised by Janek Vind. Previously, the author endpoint could be used to find usernames based on user ID if the display name was kept as the username. While WordPress itself will make this information available, some users employ methods to prevent WordPress from making this information public. Hence, changes were made to the default behavior in Breadcrumb NavXT

Primary/Secondary Hierarchy

This newly introduced option for post types (except pages), allows for hierarchies that start with the post parent and once that hierarchy has been exhausted follows the post hierarchy option. This allows attachment like behavior for custom post types.

As always, you can grab the latest version of Breadcrumb NavXT from the Breadcrumb NavXT page. If you experience any issues with this version of Breadcrumb NavXT, please leave a comment on this post detailing the issue.

-John Havlik

[end of transmission, stay tuned]

Enabling the Breadcrumb NavXT REST API

Beginning in Breadcrumb NavXT 6.2, the REST API endpoints provided by Breadcrumb NavXT are no longer automatically enabled. Instead, the specific endpoints must be requested using the bcn_register_rest_endpoint filter. Currently, there are three available endpoints: post, taxonomy, and author.

Below is an example of how to enable the Breadcrumb NavXT post endpoint. It is recommended to run this in the WordPress rest_api_init action at a priority of 9 or higher. This is to ensure the filter is registered before Breadcrumb NavXT attempts to run it.

add_filter('bcn_register_rest_endpoint', 'my_bcn_endpoint_filter', 10, 4);
function my_bcn_endpoint_filter($register_rest_endpoint, $endpoint, $version, $methods)
{
	if($endpoint === 'post')
	{
		$register_rest_endpoint = true;
	}
	return $register_rest_endpoint;
}

Enabling multiple endpoints is as simple as ORing checks of the value of $endpoint in the if statement. One important behavior to note: if BCN_DISABLE_REST_API is set to true, the Breadcrumb NavXT REST API will not be available. That is, an endpoint will be enabled if it is requested via the bcn_register_rest_endpoint filter and BCN_DISABLE_REST_API is set to false or is not set.

-John Havlik

[end of transmission, stay tuned]