This is forked for CakePHP2.
Complete tool for all your CakePHP Search Engine Optimization needs
- Easy yet powerful 301 redirect tools only loaded when a 404 would otherwise occur
- Highly configurable and intelligent 404 deep url guessing utilizing levenshtein's distance and your sitemap.xml
- Highly configurable and customizable Meta Tags for any incoming URI
- Title tag overwrites based on URI
- Custom Status Codes based on URI
- Scrapper Banning administration, complete with honeyPot baiting for scrappers to ban themselves.
- Google Analytics AB Testing Management based on URIs
See CHANGELOG.md for version history.
Clone the repository into your app/Plugin/Seo directory:
composer require pieceofcake2/seoRun the schema into your database:
cake schema create --plugin SeoCreate the file app/Config/seo.php with the following configurations like so:
$config = [
'Seo' => [
'approverEmail' => '[email protected]',
'replyEmail' => '[email protected]',
'emailConfig' => 'default', //config of your email, if false will use default CakeEmail()
'parentDomain' => 'http://www.example.com',
'aggressive' => true, //if false, log affenders for later review instead of autobanning
'triggerCount' => 2,
'timeBetweenTriggers' => 60 * 60 * 24, //seconds
'honeyPot' => ['admin' => false, 'plugin' => 'seo', 'controller' => 'seo_blacklists', 'action' => 'honeypot'],
'log' => true,
'cacheEngine' => false, // optionally cache things to save on DB requests - eg: 'default'
'searchTerms' => true, //turn on term finding
'levenshtein' => [
'active' => false,
'threshold' => 5, //-1 to ALWAYS find the closest match
'cost_add' => 1, //cost to add a character, higher the amount the less you can add to find a match
'cost_change' => 1, //cost to change a character, higher the amount the less you can change to find a match
'cost_delete' => 1, //cost to delete a character, higher the ammount the less you can delete to find a match
'source' => '/sitemap.xml', //URL to list of urls in a sitemap
],
'abTesting' => [
'category' => 'ABTest', //Category for your ABTesting in Google Analytics
'scope' => 3, //Scope for your ABTesting in Google Analytics
'slot' => 4, //Slot for your ABTesting in Google Analytics
'legacy' => false, //Uses Legacy verion of Google Analytics JS code pageTracker._setCustomVar(...)
'session' => true, //will use sessions to store tests for users who've already seen them.
'redmine' => false, //or the full URL if your redmine http://www.redmine-example.com/issues/
],
],
];update file app/Config/core.php with the following:
Configure::write('Exception', [
'handler' => 'SeoExceptionHandler::handle',
'renderer' => 'ExceptionRenderer',
'log' => true,
]);update file app/Config/bootstrap.php with the following:
require_once APP . 'Plugin' . DS . 'Seo' . DS . 'Lib' . DS . 'Error' . DS . 'SeoAppError.php';http://www.example.com/admin/seo/seo_redirects/
http://www.example.com/admin/seo/seo_status_codes/
NOTE: Special case Status Code 200 will return minimum bandwidth noindex robots page, for alternative url killing (410 alternative)
Include the Seo.Seo Helper to your AppController.php:
public $helpers = ['Seo.Seo'];Alter your layout to include the Seo Meta Tags in the head of your layout
<head>
<!-- other head items -->
<?php echo $this->Seo->metaTags(); ?>
</head>http://www.example.com/admin/seo/seo_meta_tags
Include the Seo.Seo Helper to your AppController.php:
public $helpers = ['Seo.Seo'];Alter your layout to include the Seo Title in the head of your layout
<head>
<!-- other head items -->
<?php echo $this->Seo->title($title_for_layout); ?>
</head>http://www.example.com/admin/seo/seo_titles
Include the Seo.Seo Helper to your AppController.php:
public $helpers = ['Seo.Seo'];Alter your layout to include the Seo Canonical in the head of your layout
<head>
<!-- other head items -->
<?php echo $this->Seo->canonical(); ?>
</head>http://www.example.com/admin/seo/seo_canonicals
Include The Seo.BlackList Component in your AppController.php:
public $components = ['Seo.BlackList'];Start adding honeypot links in and around your application to bait malicious content grabbers
<?php echo $this->Seo->honeyPot(); ?>Update your robots.txt to exclude /seo/ from being spidered. All legitimate spiders will ignore the honeyPot
User-agent: *
Disallow: /seo/http://www.example.com/admin/seo/seo_blacklists
Include the Seo.Seo Helper and the Seo.ABTest Component to your AppController.php:
public $helpers = ['Seo.Seo'];
public $components = ['Seo.ABTest'];In your GA code on your site add the line like so:
<script type="text/javascript">
<!-- GA Items -->
var pageTracker = _gat._getTracker('UA-SOMEKEY');
<?php echo $this->Seo->getABTestJS(); ?>
</script>In your AppController.php, to test if you're on a testable page and serve it do something like this:
public function beforeFilter(){
if($test = $this->ABTest->getTest()){
//Do things specific to this test
$this->set('ABTest', $test);
$this->view = $test['SeoABTest']['slug'];
}
return parent::beforeFilter();
}ProTip: For debuging in your controller before going live in GA set the debug flag to true, this will return tests that aren't active yet.
$test = $this->SeoABTest->getTest(['debug' => true]);http://www.example.com/admin/seo/seo_a_b_tests
ProTip: By setting the ABTest to debug, it will return true in your controller, but you won't be tracking the GA code.