]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - plugins/Sitemap/SitemapPlugin.php
People tags -> Lists (only UI changes, for experimentation)
[quix0rs-gnu-social.git] / plugins / Sitemap / SitemapPlugin.php
index bb404cd25ee53d706cd74107cc3a087572e4ada8..36041cfc9a025d7edcbb0368438bf1d03661081e 100644 (file)
@@ -44,9 +44,11 @@ if (!defined('STATUSNET')) {
  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
  * @link      http://status.net/
  */
-
 class SitemapPlugin extends Plugin
 {
+    const USERS_PER_MAP   = 50000;
+    const NOTICES_PER_MAP = 50000;
+
     /**
      * Load related modules when needed
      *
@@ -54,25 +56,46 @@ class SitemapPlugin extends Plugin
      *
      * @return boolean hook value; true means continue processing, false means stop.
      */
-
     function onAutoload($cls)
     {
         $dir = dirname(__FILE__);
 
         switch ($cls)
         {
+        case 'Sitemap_user_count':
+        case 'Sitemap_notice_count':
+            require_once $dir . '/' . $cls . '.php';
+            return false;
         case 'SitemapindexAction':
         case 'NoticesitemapAction':
         case 'UsersitemapAction':
+        case 'SitemapadminpanelAction':
             require_once $dir . '/' . strtolower(mb_substr($cls, 0, -6)) . '.php';
             return false;
         case 'SitemapAction':
             require_once $dir . '/' . strtolower($cls) . '.php';
+            return false;
         default:
             return true;
         }
     }
 
+    /**
+     * Add sitemap-related information at the end of robots.txt
+     *
+     * @param Action $action Action being run
+     *
+     * @return boolean hook value.
+     */
+    function onEndRobotsTxt($action)
+    {
+        $url = common_local_url('sitemapindex');
+
+        print "\nSitemap: $url\n";
+
+        return true;
+    }
+
     /**
      * Map URLs to actions
      *
@@ -80,23 +103,140 @@ class SitemapPlugin extends Plugin
      *
      * @return boolean hook value; true means continue processing, false means stop.
      */
-
     function onRouterInitialized($m)
     {
         $m->connect('sitemapindex.xml',
                     array('action' => 'sitemapindex'));
-        $m->connect('/sitemaps/notice/:year/:month/:day/:index.xml',
+
+        $m->connect('/notice-sitemap-:year-:month-:day-:index.xml',
                     array('action' => 'noticesitemap'),
                     array('year' => '[0-9]{4}',
                           'month' => '[01][0-9]',
                           'day' => '[0123][0-9]',
                           'index' => '[1-9][0-9]*'));
 
-        $m->connect('/sitemaps/user/:index.xml',
+        $m->connect('/user-sitemap-:year-:month-:day-:index.xml',
                     array('action' => 'usersitemap'),
-                    array('index' => '[0-9]+',
-                          'month' => '[1]?[0-9]',
-                          'day' => '[123]?[0-9]'));
+                    array('year' => '[0-9]{4}',
+                          'month' => '[01][0-9]',
+                          'day' => '[0123][0-9]',
+                          'index' => '[1-9][0-9]*'));
+
+        $m->connect('panel/sitemap',
+                    array('action' => 'sitemapadminpanel'));
+
+        return true;
+    }
+
+    /**
+     * Meta tags for "claiming" a site
+     *
+     * We add extra meta tags that search engines like Yahoo!, Google, and Bing
+     * require to let you claim your site.
+     *
+     * @param Action $action Action being executed
+     *
+     * @return boolean hook value.
+     */
+    function onStartShowHeadElements($action)
+    {
+        $actionName = $action->trimmed('action');
+
+        $singleUser = common_config('singleuser', 'enabled');
+
+        // Different "top" pages if it's single user or not
+
+        if (($singleUser && $actionName == 'showstream') ||
+            (!$singleUser && $actionName == 'public')) {
+
+            $keys = array('googlekey' => 'google-site-verification',
+                          'yahookey' => 'y_key',
+                          'bingkey' => 'msvalidate.01'); // XXX: is this the same for all sites?
+
+            foreach ($keys as $config => $metaname) {
+                $content = common_config('sitemap', $config);
+
+                if (!empty($content)) {
+                    $action->element('meta', array('name' => $metaname,
+                                                   'content' => $content));
+                }
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * Database schema setup
+     *
+     * We cache some data persistently to avoid overlong queries.
+     *
+     * @see Sitemap_user_count
+     * @see Sitemap_notice_count
+     *
+     * @return boolean hook value; true means continue processing, false means stop.
+     */
+    function onCheckSchema()
+    {
+        $schema = Schema::get();
+
+        $schema->ensureTable('sitemap_user_count',
+                             array(new ColumnDef('registration_date', 'date', null,
+                                                 true, 'PRI'),
+                                   new ColumnDef('user_count', 'integer'),
+                                   new ColumnDef('created', 'datetime',
+                                                 null, false),
+                                   new ColumnDef('modified', 'timestamp')));
+
+        $schema->ensureTable('sitemap_notice_count',
+                             array(new ColumnDef('notice_date', 'date', null,
+                                                 true, 'PRI'),
+                                   new ColumnDef('notice_count', 'integer'),
+                                   new ColumnDef('created', 'datetime',
+                                                 null, false),
+                                   new ColumnDef('modified', 'timestamp')));
+
+        $userCreated = $schema->getColumnDef('user', 'created');
+
+        if (empty($userCreated) || $userCreated->key != 'MUL') {
+            $schema->createIndex('user', 'created');
+        }
+
+        return true;
+    }
+
+    function onEndAdminPanelNav($menu) {
+        if (AdminPanelAction::canAdmin('sitemap')) {
+            // TRANS: Menu item title/tooltip
+            $menu_title = _m('Sitemap configuration');
+            // TRANS: Menu item for site administration
+            $menu->out->menuItem(common_local_url('sitemapadminpanel'), _m('MENU','Sitemap'),
+                                 $menu_title, $action_name == 'sitemapadminpanel', 'nav_sitemap_admin_panel');
+        }
+        return true;
+    }
+
+    /**
+     * Provide plugin version information.
+     *
+     * This data is used when showing the version page.
+     *
+     * @param array &$versions array of version data arrays; see EVENTS.txt
+     *
+     * @return boolean hook value
+     */
+    function onPluginVersion(&$versions)
+    {
+        $url = 'http://status.net/wiki/Plugin:Sitemap';
+
+        $versions[] = array('name' => 'Sitemap',
+            'version' => STATUSNET_VERSION,
+            'author' => 'Evan Prodromou',
+            'homepage' => $url,
+            'rawdescription' =>
+            // TRANS: Plugin description.
+            _m('This plugin allows creation of sitemaps for Bing, Yahoo! and Google.'));
+
         return true;
     }
 }