200+
June 16, 2023
April 26, 2021
Sophi.io is a suite of artificial intelligence (AI) tools developed by The Globe and Mail to help content publishers make important strategic and tactical decisions. The tools range from automated content curation engines to predictive analytics and paywall solutions.
Sophi-driven pages outperform human curated pages by a significant margin and free up publisher resources so that they can focus on finding the next story that matters. Invisible, automated curation of your home and section pages to streamline your team’s workflow. Continuously optimize the performance characteristics of the site based on demand and your brand, so the content is always the right fit.
Note that a Sophi.io account and related credentials are required in order to authorize and authenticate access within the plugin settings.
There are two potential ways to integrate Sophi Site Automation results with your WordPress site. The default approach includes a Sophi Site Automation block that integrates with get_posts
by injecting Posts IDs via the posts_pre_query
filter that gets fetched later to return the actual Posts. In the same fashion, you can integrate Sophi results with your WP_Query
object by setting the sophi_curated_page
and sophi_curated_widget
query parameters.
More details on each of these two options are described below. If you are not certain on the best integration approach, considering the following:
Reasons to use the Site Automation block:
– No additional development effort needed for initial Sophi integration
– Immediate integration with Sophi Site Automation API and page/widget settings
– Basic block display settings allow for basic configurations (show/hide post excerpt, author name, post date, featured image)
Reasons to use the Query integration:
– Can implement more custom caching and content fallback options
– Can implement support into non-block editor setups
– Likely more flexible for headless setups
– Block editor is not in-use within your WordPress environment
– You need an integration with Category/Taxonomy Pages and cannot integrate using a sidebar widget
You can utilize the Site Automation block by configuring the Site Automation page and widget names and adjusting block content and post meta settings to display Site Automation content on your site.
The Site Automation block comes with a barebone HTML output and styling. It’s made to be filtered using sophi_site_automation_block_output
.
add_filter(
'sophi_site_automation_block_output',
function( $output, $curated_posts, $attributes, $content, $block ) {
// ...
return $new_output;
},
10,
5
);
The Site Automation block will automatically add a data-sophi-feature=<widget_name>
attribute for the rendered HTML content so Sophi can understand what content section is rendered on your site.
The Site Automation block uses query integration under the hood. You can query for Sophi curated articles by passing sophi_curated_page
and sophi_curated_widget
to your WP_Query queries.
$the_query = new WP_Query( [
'sophi_curated_page' => 'page-name',
'sophi_curated_widget' => 'widget-name',
] );
Note that you need to add data-sophi-feature=<widget_name>
to the wrapper div of your post for Sophi to capture your widget better.
<div class="posts-wrapper" data-sophi-feature="trending">
<!-- Post lists -->
</div>
While the above query integration works just fine, it has been observed on WordPress VIP infrastructure that WP_Query
may return latest posts instead of the posts curated by Sophi due to the Advanced Post Cache plugin used by the VIP platform. A workaround for this is to use get_posts()
instead and as good practice to add a comment explaining the usage of it so that developers new to it don’t swap it for WP_Query
. Also remember to whitelist get_posts
by adding the following inline comment so that PHPCS doesn’t throw a warning:
phpcs:ignore WordPressVIPMinimum.Functions.RestrictedFunctions.get_posts_get_posts<h3>Developer Documentation</h3>
Sophi for WordPress has an in-depth documentation site that details the available actions and filters found within the plugin. Visit the developer docs ☞
If you are having difficulties with your Sophi integration, then we recommend utilizing the Debug Bar for Sophi plugin to help triage your Sophi Authentication, Sophi API integration, and CMS publish/update events.
Note that if you are on the WordPress VIP platform that you will not be able to upload a plugin in the WordPress Admin so you will need to follow steps in 1b.
1a Download plugin ZIP file and upload to your site.
You can upload and install the plugin ZIP file via the WordPress dashboard (Plugins
> Add New
-> Upload Plugin
) or manually inside of the wp-content/plugins
directory, and activate on the Plugins dashboard.
1b Download or Clone this repo, install dependencies, and build.
– git clone https://github.com/globeandmail/sophi-for-wordpress.git && cd sophi-for-wordpress
– composer install && npm install && npm run build
2 Activate Plugin
Click the Activate
link after installing the plugin.
3 Configure plugin settings
Go to Settings
> Sophi
in the WordPress Admin and enter your Sophi Collector and Site Automation credentials supplied by the Sophi.io team. Click Save Changes
button to validate and save your credentials.
Once your credentials are validated and saved, your site is officially supercharged by the Sophi.io Site Automation service. You also have access to Sophi for WordPress’ powerful WP_Query parameters and custom Sophi Site Automation block, which enables you to utilize Site Automation to power the content curation on your site.
The award-winning Sophi suite of solutions was developed by The Globe and Mail to help content publishers make important strategic and tactical decisions that transform their business. It is a suite of ML and NLP-powered tools that includes Sophi Automation for content curation, Sophi for Paywalls, and Sophi Analytics – a decision-support system for publishers.
The Globe and Mail saw a dramatic improvement in the business metrics that matter:
* Click-through rates were up 17% from the homepage.
* The subscriber acquisition rate increased by more than 10%.
* Not a single reader has complained or asked if a computer is curating the website.
You can read more details in The Globe and Mail case study.
The same Privacy & Terms that govern The Globe and Mail cover the Sophi.io service.
phpunit/phpunit
from 9.5.25 to 9.5.27 (props @renovate, @jeffpaul via #349, #369).10up-toolkit
from 4.3.0.to 4.3.1 (props @renovate, @jeffpaul via #366).loader-utils
from 2.0.2 to 2.0.4 (props @dependabot, @jeffpaul via #367).actions/checkout
from 3.1.0 to 3.5.3 (props @renovate, @jeffpaul, @iamdharmesh via #370, #375).@wordpress/icons
from 9.10.0 to 9.14.0 (props @renovate, @jeffpaul via #344).snowplow/snowplow-tracker
from 0.5.0 to 0.6.1 (props @renovate, @jeffpaul, @YMufleh via #372).json5
from 1.0.1 to 1.0.2 (props @renovate, @iamdharmesh via #374).dns-packet
from 5.3.1 to 5.6.0 (props @renovate, @iamdharmesh via #385).webpack
from 5.72.1 to 5.87.0 (props @renovate, @iamdharmesh via #386).sectionNames
field to reflect Primary Category or first Category (props @Sidsector9, @cadic, @jeffpaul, @vjayaseelan90, @dkotter via #350, #363).Note that this version bumps the minimum WordPress version from 5.6 to 6.0 and adds an integration with the Sophi Override feature.
/wp-json/sophi/v1/site-automation
WP REST endpoint to Get Posts from Site Automation (props @faisal-alvi, @jeffpaul, @fabiankaegy, @dkotter, @peterwilsoncc via #333)./wp-json/sophi/v1/site-automation-override
WP REST endpoint to Override the Posts for Site Automation (props @faisal-alvi, @jeffpaul, @fabiankaegy, @dkotter, @peterwilsoncc via #333).api_version
to the block JSON files (props @faisal-alvi via #345).phpunit/phpunit
from 8.5.29 to 9.5.25 (props @renovate, @Sidsector9, @faisal-alvi via #329, #337, #339).10up-toolkit
from 4.1.2 to 4.3.0 (props @renovate, @Sidsector9, @faisal-alvi via #330, #340).actions/checkout
action from v2 to v3 and v3.0.2 to v3.1.0 (props @renovate via #334).content_update
schema from 2-0-3 to 2-0-5 (props @jeffpaul, @vjayaseelan90, @YMufleh via #323).jsdoc
from 3.6.10 to 3.6.11 (props @renovate via #311).terser
from 5.13.1 to 5.14.2 (props @dependabot via #312).phpunit/phpunit
from 8.5.27 to 8.5.29 (props @renovate via #316).sophi-response
(props @oscarssanchez, @cadic, @felipeelia via #298.WP_Query
with get_posts
in details about the Sophi Automation block (props @Sidsector9, @jeffpaul via #300.10up-toolkit
from v4.0.0 to v4.1.2 (props @renovate, @Sidsector9 via #299, #303.phpunit/phpunit
from v8.5.26 to v8.5.27 (props @renovate via #304.sophi_cache_duration
filter (props @Sidsector9, @barryceelen, @jeffpaul via #285).block_categories
filter with block_categories_all
(props @Sidsector9, @cadic, @jeffpaul via #292).sophi_bypass_curated_posts_cache
filter to bypess curated posts cache (props @cadic).allSections
field to Sophi (props @oscarssanchez, @jeffpaul, @tott).$result
is used instead of $request
to store return value of the sophi_request_result
filter (props @faisal-alvi, @Sidsector9, @cadic).sophi_request_args
filters arguments used in Sophi HTTP request (props @cadic, @iamdharmesh via #257).sophi_request_result
filters a Sophi HTTP request immediately after the response is received (props @cadic, @iamdharmesh via #257, #261).sophi_cms_tracking_request_data
filters the data used in Sophi track event request (props @cadic, @iamdharmesh, @jeffpaul via #257, #263).sophi_cms_tracking_result
fires after tracker sends the request (props @cadic, @iamdharmesh, @jeffpaul via #257, #263).sophi_tracker_emitter_debug
allows to enable debug mode in the tracking emitter (props @cadic, @iamdharmesh via #257).WP_Query
caveat on WordPress VIP (props @Sidsector9, @jeffpaul, @oscarssanchez via #242, #249, #251).$terms
is an array before using count()
within get_the_terms()
(props @barryceelen, @Sidsector9 via #215).track_event
arguments list inside sync
WP-CLI command (props @cadic, @Sidsector9 via #250).actions/checkout
action to from v2.4.0 to v3.0.2 (props @renovate, @iamdharmesh via #240, #241, #243).actions/setup-node
action from v1 to v3 (props @renovate, @iamdharmesh via #244).10up-toolkit
from 3.1.2 to 4.0.0 (props @renovate, @cadic via #264).keywords
data type from string to array (props @iamdharmesh, @jeffpaul, @oscarssanchez, @YMufleh).node-forge
from 1.2.1 to 1.3.0 (props @dependabot).minimist
from 1.2.5 to 1.2.6 (props @dependabot).10up-toolkit
from 3.0.3 to 3.1.2 (props @renovate).phpunit/phpunit
from 8.5.25 to 8.5.26 (props @renovate).async
from 2.6.3 to 2.6.4 (props @dependabot).phpunit/phpunit
from 8.5.23 to 8.5.25 (props @renovate).10up-toolkit
from 3.0.2 to 3.0.3 (props @renovate).package-lock.json
(props @jeffpaul).actions/setup-node
action from v2 to v3 (props @renovate).actions/checkout
action from v2 to v3 (props @renovate).10up-toolkit
from 2.1.1 to 3.0.2 (props @renovate).snowplow/snowplow-tracker
from 0.4.0 to 0.5.0 (props @renovate).hostname
and path
fields to schema (props @Rahmon, @dinhtungdu).sophi_curated_post_list
filter to modify the Sophi API response to allow manual posts to be injected previous to returning the filterable value from posts_pre_query
(e.g., via a fallback method to inject posts that would be a good fit) (props @oscarssanchez, @barryceelen, @felipeelia).WP_Query
default results to a “no results” response (props @oscarssanchez, @barryceelen, @felipeelia).phpunit/phpunit
from 8.5.21 to 8.5.23 (props @renovate).prop-types
from 15.8.0 to 15.8.1 (props @renovate).10up-toolkit
from 1.0.13
to 2.1.1
(props @renovate, @oscarssanchez, @jeffpaul).marked
from 2.1.3 to 4.0.10 (props @renovate).jsdoc
from 3.6.8 to 3.6.10 (props @renovate).dealerdirect/phpcodesniffer-composer-installer
from 0.7.1 to 0.7.2 (props @renovate).auth_url
and audience
parameters to get respective Staging and Development environment access tokens (props @Rahmon, @felipeelia).prop-types
from 15.7.2 to 15.8.0 (props @renovate).Note: this was a hotfix release to fix an issue with deploys to WordPress.org.
thumbnailImageUri
, embeddedImagesCount
, and keywords
(props @rahmohn, @felipeelia, @dinhtungdu).appId
(props @rahmohn, @felipeelia, @dinhtungdu).sectionNames
field (props @rahmohn, @jeffpaul, @felipeelia, @tott).article
to section
content type (props @rahmohn, @felipeelia, @jeffpaul).audience
URL (props @rahmohn, @jeffpaul).10up-toolkit
from 1.0.9 to 1.0.13 (props @renovate).phpunit/phpunit
from 8.5.18 to 8.5.21 (props @renovate).automattic/vipwpcs
from 2.3.2 to 2.3.3 (props @renovate).sectionNames
(props @dinhtungdu, @dkotter).jsonschema
to 2.0.0 (props @dinhtungdu, @dkotter).contentSize
to size
(props @dinhtungdu).@10up/scripts
from 1.3.1 to 1.3.4 (props @renovate).automattic/vipwpcs
from 2.3.0 to 2.3.2 (props @renovate).phpunit/phpunit
from 8.5.15 to 8.5.18 (props @renovate).actions/setup-node
action from v1 to v2 (props @renovate).10up-toolkit
from 1.0.9 to 1.0.10 (props @renovate).wp_get_environment_type()
(props @barryceelen).false
, corrects sync limiting, adds progress bar (props @dinhtungdu, @jeffpaul, @barryceelen).vipwpcs
from 2.2.0 to 2.3.0 and php_codesniffer
from 3.5.8 to 3.6.0 (props @dinhtungdu, @jeffpaul).noConfigFile
setting (props @dinhtungdu).Sophi for WordPress
to Sophi
(props @jeffpaul).Version | Download | Type |
---|---|---|
1.3.2 | Download | Stable |
1.3.1 | Download | Stable |
1.3.0 | Download | Stable |
1.2.1 | Download | Stable |
1.2.0 | Download | Stable |
1.1.3 | Download | Stable |
1.1.2 | Download | Stable |
1.1.1 | Download | Stable |
1.1.0 | Download | Stable |
1.0.13 | Download | Stable |
1.0.12 | Download | Stable |
1.0.11 | Download | Stable |
1.0.10 | Download | Stable |
1.0.9 | Download | Stable |
1.0.8 | Download | Stable |
1.0.7 | Download | Stable |
1.0.6 | Download | Stable |
1.0.5 | Download | Stable |
1.0.4 | Download | Stable |
1.0.3 | Download | Stable |
1.0.2 | Download | Stable |
Development | Download | Trunk |