[44] | 1 | <?php
|
---|
| 2 | /*
|
---|
| 3 |
|
---|
| 4 | $Id: sitemap-core.php 150610 2009-08-30 21:11:36Z arnee $
|
---|
| 5 |
|
---|
| 6 | */
|
---|
| 7 |
|
---|
| 8 | //Enable for dev! Good code doesn't generate any notices...
|
---|
| 9 | //error_reporting(E_ALL);
|
---|
| 10 | //ini_set("display_errors",1);
|
---|
| 11 |
|
---|
| 12 | #region PHP5 compat functions
|
---|
| 13 | if (!function_exists('file_get_contents')) {
|
---|
| 14 | /**
|
---|
| 15 | * Replace file_get_contents()
|
---|
| 16 | *
|
---|
| 17 | * @category PHP
|
---|
| 18 | * @package PHP_Compat
|
---|
| 19 | * @link http://php.net/function.file_get_contents
|
---|
| 20 | * @author Aidan Lister <aidan - php - net>
|
---|
| 21 | * @version $Revision: 1.21 $
|
---|
| 22 | * @internal resource_context is not supported
|
---|
| 23 | * @since PHP 5
|
---|
| 24 | */
|
---|
| 25 | function file_get_contents($filename, $incpath = false, $resource_context = null) {
|
---|
| 26 | if (false === $fh = fopen($filename, 'rb', $incpath)) {
|
---|
| 27 | user_error('file_get_contents() failed to open stream: No such file or directory', E_USER_WARNING);
|
---|
| 28 | return false;
|
---|
| 29 | }
|
---|
| 30 |
|
---|
| 31 | clearstatcache();
|
---|
| 32 | if ($fsize = @filesize($filename)) {
|
---|
| 33 | $data = fread($fh, $fsize);
|
---|
| 34 | } else {
|
---|
| 35 | $data = '';
|
---|
| 36 | while (!feof($fh)) {
|
---|
| 37 | $data .= fread($fh, 8192);
|
---|
| 38 | }
|
---|
| 39 | }
|
---|
| 40 |
|
---|
| 41 | fclose($fh);
|
---|
| 42 | return $data;
|
---|
| 43 | }
|
---|
| 44 | }
|
---|
| 45 |
|
---|
| 46 |
|
---|
| 47 | if(!function_exists('file_put_contents')) {
|
---|
| 48 |
|
---|
| 49 | if (!defined('FILE_USE_INCLUDE_PATH')) {
|
---|
| 50 | define('FILE_USE_INCLUDE_PATH', 1);
|
---|
| 51 | }
|
---|
| 52 |
|
---|
| 53 | if (!defined('LOCK_EX')) {
|
---|
| 54 | define('LOCK_EX', 2);
|
---|
| 55 | }
|
---|
| 56 |
|
---|
| 57 | if (!defined('FILE_APPEND')) {
|
---|
| 58 | define('FILE_APPEND', 8);
|
---|
| 59 | }
|
---|
| 60 |
|
---|
| 61 |
|
---|
| 62 | /**
|
---|
| 63 | * Replace file_put_contents()
|
---|
| 64 | *
|
---|
| 65 | * @category PHP
|
---|
| 66 | * @package PHP_Compat
|
---|
| 67 | * @link http://php.net/function.file_put_contents
|
---|
| 68 | * @author Aidan Lister <aidan - php - net>
|
---|
| 69 | * @version $Revision: 1.25 $
|
---|
| 70 | * @internal resource_context is not supported
|
---|
| 71 | * @since PHP 5
|
---|
| 72 | * @require PHP 4.0.0 (user_error)
|
---|
| 73 | */
|
---|
| 74 | function file_put_contents($filename, $content, $flags = null, $resource_context = null) {
|
---|
| 75 | // If $content is an array, convert it to a string
|
---|
| 76 | if (is_array($content)) {
|
---|
| 77 | $content = implode('', $content);
|
---|
| 78 | }
|
---|
| 79 |
|
---|
| 80 | // If we don't have a string, throw an error
|
---|
| 81 | if (!is_scalar($content)) {
|
---|
| 82 | user_error('file_put_contents() The 2nd parameter should be either a string or an array',E_USER_WARNING);
|
---|
| 83 | return false;
|
---|
| 84 | }
|
---|
| 85 |
|
---|
| 86 | // Get the length of data to write
|
---|
| 87 | $length = strlen($content);
|
---|
| 88 |
|
---|
| 89 | // Check what mode we are using
|
---|
| 90 | $mode = ($flags & FILE_APPEND)?'a':'wb';
|
---|
| 91 |
|
---|
| 92 | // Check if we're using the include path
|
---|
| 93 | $use_inc_path = ($flags & FILE_USE_INCLUDE_PATH)?true:false;
|
---|
| 94 |
|
---|
| 95 | // Open the file for writing
|
---|
| 96 | if (($fh = @fopen($filename, $mode, $use_inc_path)) === false) {
|
---|
| 97 | user_error('file_put_contents() failed to open stream: Permission denied',E_USER_WARNING);
|
---|
| 98 | return false;
|
---|
| 99 | }
|
---|
| 100 |
|
---|
| 101 | // Attempt to get an exclusive lock
|
---|
| 102 | $use_lock = ($flags & LOCK_EX) ? true : false ;
|
---|
| 103 | if ($use_lock === true) {
|
---|
| 104 | if (!flock($fh, LOCK_EX)) {
|
---|
| 105 | return false;
|
---|
| 106 | }
|
---|
| 107 | }
|
---|
| 108 |
|
---|
| 109 | // Write to the file
|
---|
| 110 | $bytes = 0;
|
---|
| 111 | if (($bytes = @fwrite($fh, $content)) === false) {
|
---|
| 112 | $errormsg = sprintf('file_put_contents() Failed to write %d bytes to %s',$length,$filename);
|
---|
| 113 | user_error($errormsg, E_USER_WARNING);
|
---|
| 114 | return false;
|
---|
| 115 | }
|
---|
| 116 |
|
---|
| 117 | // Close the handle
|
---|
| 118 | @fclose($fh);
|
---|
| 119 |
|
---|
| 120 | // Check all the data was written
|
---|
| 121 | if ($bytes != $length) {
|
---|
| 122 | $errormsg = sprintf('file_put_contents() Only %d of %d bytes written, possibly out of free disk space.',$bytes,$length);
|
---|
| 123 | user_error($errormsg, E_USER_WARNING);
|
---|
| 124 | return false;
|
---|
| 125 | }
|
---|
| 126 |
|
---|
| 127 | // Return length
|
---|
| 128 | return $bytes;
|
---|
| 129 | }
|
---|
| 130 |
|
---|
| 131 | }
|
---|
| 132 | #endregion
|
---|
| 133 |
|
---|
| 134 | /**
|
---|
| 135 | * Represents the status (success and failures) of a building process
|
---|
| 136 | * @author Arne Brachhold
|
---|
| 137 | * @package sitemap
|
---|
| 138 | * @since 3.0b5
|
---|
| 139 | */
|
---|
| 140 | class GoogleSitemapGeneratorStatus {
|
---|
| 141 |
|
---|
| 142 | function GoogleSitemapGeneratorStatus() {
|
---|
| 143 | $this->_startTime = $this->GetMicrotimeFloat();
|
---|
| 144 |
|
---|
| 145 | $exists = get_option("sm_status");
|
---|
| 146 |
|
---|
| 147 | if($exists === false) add_option("sm_status","","Status","no");
|
---|
| 148 |
|
---|
| 149 | $this->Save();
|
---|
| 150 | }
|
---|
| 151 |
|
---|
| 152 | function Save() {
|
---|
| 153 | update_option("sm_status",$this);
|
---|
| 154 | }
|
---|
| 155 |
|
---|
| 156 | function Load() {
|
---|
| 157 | $status = @get_option("sm_status");
|
---|
| 158 | if(is_a($status,"GoogleSitemapGeneratorStatus")) return $status;
|
---|
| 159 | else return null;
|
---|
| 160 | }
|
---|
| 161 |
|
---|
| 162 | /**
|
---|
| 163 | * @var float $_startTime The start time of the building process
|
---|
| 164 | * @access private
|
---|
| 165 | */
|
---|
| 166 | var $_startTime = 0;
|
---|
| 167 |
|
---|
| 168 | /**
|
---|
| 169 | * @var float $_endTime The end time of the building process
|
---|
| 170 | * @access private
|
---|
| 171 | */
|
---|
| 172 | var $_endTime = 0;
|
---|
| 173 |
|
---|
| 174 | /**
|
---|
| 175 | * @var bool $$_hasChanged Indicates if the sitemap content has changed
|
---|
| 176 | * @access private
|
---|
| 177 | */
|
---|
| 178 | var $_hasChanged = true;
|
---|
| 179 |
|
---|
| 180 | /**
|
---|
| 181 | * @var int $_memoryUsage The amount of memory used in bytes
|
---|
| 182 | * @access private
|
---|
| 183 | */
|
---|
| 184 | var $_memoryUsage = 0;
|
---|
| 185 |
|
---|
| 186 | /**
|
---|
| 187 | * @var int $_lastPost The number of posts processed. This value is updated every 50 posts.
|
---|
| 188 | * @access private
|
---|
| 189 | */
|
---|
| 190 | var $_lastPost = 0;
|
---|
| 191 |
|
---|
| 192 | /**
|
---|
| 193 | * @var int $_lastTime The time when the last step-update occured. This value is updated every 50 posts.
|
---|
| 194 | * @access private
|
---|
| 195 | */
|
---|
| 196 | var $_lastTime = 0;
|
---|
| 197 |
|
---|
| 198 | function End($hasChanged = true) {
|
---|
| 199 | $this->_endTime = $this->GetMicrotimeFloat();
|
---|
| 200 |
|
---|
| 201 | $this->SetMemoryUsage();
|
---|
| 202 |
|
---|
| 203 | $this->_hasChanged = $hasChanged;
|
---|
| 204 |
|
---|
| 205 | $this->Save();
|
---|
| 206 | }
|
---|
| 207 |
|
---|
| 208 | function SetMemoryUsage() {
|
---|
| 209 | if(function_exists("memory_get_peak_usage")) {
|
---|
| 210 | $this->_memoryUsage = memory_get_peak_usage(true);
|
---|
| 211 | } else if(function_exists("memory_get_usage")) {
|
---|
| 212 | $this->_memoryUsage = memory_get_usage(true);
|
---|
| 213 | }
|
---|
| 214 | }
|
---|
| 215 |
|
---|
| 216 | function GetMemoryUsage() {
|
---|
| 217 | return round($this->_memoryUsage / 1024 / 1024,2);
|
---|
| 218 | }
|
---|
| 219 |
|
---|
| 220 | function SaveStep($postCount) {
|
---|
| 221 | $this->SetMemoryUsage();
|
---|
| 222 | $this->_lastPost = $postCount;
|
---|
| 223 | $this->_lastTime = $this->GetMicrotimeFloat();
|
---|
| 224 |
|
---|
| 225 | $this->Save();
|
---|
| 226 | }
|
---|
| 227 |
|
---|
| 228 | function GetTime() {
|
---|
| 229 | return round($this->_endTime - $this->_startTime,2);
|
---|
| 230 | }
|
---|
| 231 |
|
---|
| 232 | function GetStartTime() {
|
---|
| 233 | return round($this->_startTime, 2);
|
---|
| 234 | }
|
---|
| 235 |
|
---|
| 236 | function GetLastTime() {
|
---|
| 237 | return round($this->_lastTime - $this->_startTime,2);
|
---|
| 238 | }
|
---|
| 239 |
|
---|
| 240 | function GetLastPost() {
|
---|
| 241 | return $this->_lastPost;
|
---|
| 242 | }
|
---|
| 243 |
|
---|
| 244 | var $_usedXml = false;
|
---|
| 245 | var $_xmlSuccess = false;
|
---|
| 246 | var $_xmlPath = '';
|
---|
| 247 | var $_xmlUrl = '';
|
---|
| 248 |
|
---|
| 249 | function StartXml($path,$url) {
|
---|
| 250 | $this->_usedXml = true;
|
---|
| 251 | $this->_xmlPath = $path;
|
---|
| 252 | $this->_xmlUrl = $url;
|
---|
| 253 |
|
---|
| 254 | $this->Save();
|
---|
| 255 | }
|
---|
| 256 |
|
---|
| 257 | function EndXml($success) {
|
---|
| 258 | $this->_xmlSuccess = $success;
|
---|
| 259 |
|
---|
| 260 | $this->Save();
|
---|
| 261 | }
|
---|
| 262 |
|
---|
| 263 |
|
---|
| 264 | var $_usedZip = false;
|
---|
| 265 | var $_zipSuccess = false;
|
---|
| 266 | var $_zipPath = '';
|
---|
| 267 | var $_zipUrl = '';
|
---|
| 268 |
|
---|
| 269 | function StartZip($path,$url) {
|
---|
| 270 | $this->_usedZip = true;
|
---|
| 271 | $this->_zipPath = $path;
|
---|
| 272 | $this->_zipUrl = $url;
|
---|
| 273 |
|
---|
| 274 | $this->Save();
|
---|
| 275 | }
|
---|
| 276 |
|
---|
| 277 | function EndZip($success) {
|
---|
| 278 | $this->_zipSuccess = $success;
|
---|
| 279 |
|
---|
| 280 | $this->Save();
|
---|
| 281 | }
|
---|
| 282 |
|
---|
| 283 | var $_usedGoogle = false;
|
---|
| 284 | var $_googleUrl = '';
|
---|
| 285 | var $_gooogleSuccess = false;
|
---|
| 286 | var $_googleStartTime = 0;
|
---|
| 287 | var $_googleEndTime = 0;
|
---|
| 288 |
|
---|
| 289 | function StartGooglePing($url) {
|
---|
| 290 | $this->_googleUrl = true;
|
---|
| 291 | $this->_usedGoogle = true;
|
---|
| 292 | $this->_googleStartTime = $this->GetMicrotimeFloat();
|
---|
| 293 |
|
---|
| 294 | $this->Save();
|
---|
| 295 | }
|
---|
| 296 |
|
---|
| 297 | function EndGooglePing($success) {
|
---|
| 298 | $this->_googleEndTime = $this->GetMicrotimeFloat();
|
---|
| 299 | $this->_gooogleSuccess = $success;
|
---|
| 300 |
|
---|
| 301 | $this->Save();
|
---|
| 302 | }
|
---|
| 303 |
|
---|
| 304 | function GetGoogleTime() {
|
---|
| 305 | return round($this->_googleEndTime - $this->_googleStartTime,2);
|
---|
| 306 | }
|
---|
| 307 |
|
---|
| 308 | var $_usedYahoo = false;
|
---|
| 309 | var $_yahooUrl = '';
|
---|
| 310 | var $_yahooSuccess = false;
|
---|
| 311 | var $_yahooStartTime = 0;
|
---|
| 312 | var $_yahooEndTime = 0;
|
---|
| 313 |
|
---|
| 314 | function StartYahooPing($url) {
|
---|
| 315 | $this->_yahooUrl = $url;
|
---|
| 316 | $this->_usedYahoo = true;
|
---|
| 317 | $this->_yahooStartTime = $this->GetMicrotimeFloat();
|
---|
| 318 |
|
---|
| 319 | $this->Save();
|
---|
| 320 | }
|
---|
| 321 |
|
---|
| 322 | function EndYahooPing($success) {
|
---|
| 323 | $this->_yahooEndTime = $this->GetMicrotimeFloat();
|
---|
| 324 | $this->_yahooSuccess = $success;
|
---|
| 325 |
|
---|
| 326 | $this->Save();
|
---|
| 327 | }
|
---|
| 328 |
|
---|
| 329 | function GetYahooTime() {
|
---|
| 330 | return round($this->_yahooEndTime - $this->_yahooStartTime,2);
|
---|
| 331 | }
|
---|
| 332 |
|
---|
| 333 | var $_usedAsk = false;
|
---|
| 334 | var $_askUrl = '';
|
---|
| 335 | var $_askSuccess = false;
|
---|
| 336 | var $_askStartTime = 0;
|
---|
| 337 | var $_askEndTime = 0;
|
---|
| 338 |
|
---|
| 339 | function StartAskPing($url) {
|
---|
| 340 | $this->_usedAsk = true;
|
---|
| 341 | $this->_askUrl = $url;
|
---|
| 342 | $this->_askStartTime = $this->GetMicrotimeFloat();
|
---|
| 343 |
|
---|
| 344 | $this->Save();
|
---|
| 345 | }
|
---|
| 346 |
|
---|
| 347 | function EndAskPing($success) {
|
---|
| 348 | $this->_askEndTime = $this->GetMicrotimeFloat();
|
---|
| 349 | $this->_askSuccess = $success;
|
---|
| 350 |
|
---|
| 351 | $this->Save();
|
---|
| 352 | }
|
---|
| 353 |
|
---|
| 354 | function GetAskTime() {
|
---|
| 355 | return round($this->_askEndTime - $this->_askStartTime,2);
|
---|
| 356 | }
|
---|
| 357 |
|
---|
| 358 | var $_usedMsn = false;
|
---|
| 359 | var $_msnUrl = '';
|
---|
| 360 | var $_msnSuccess = false;
|
---|
| 361 | var $_msnStartTime = 0;
|
---|
| 362 | var $_msnEndTime = 0;
|
---|
| 363 |
|
---|
| 364 | function StartMsnPing($url) {
|
---|
| 365 | $this->_usedMsn = true;
|
---|
| 366 | $this->_msnUrl = $url;
|
---|
| 367 | $this->_msnStartTime = $this->GetMicrotimeFloat();
|
---|
| 368 |
|
---|
| 369 | $this->Save();
|
---|
| 370 | }
|
---|
| 371 |
|
---|
| 372 | function EndMsnPing($success) {
|
---|
| 373 | $this->_msnEndTime = $this->GetMicrotimeFloat();
|
---|
| 374 | $this->_msnSuccess = $success;
|
---|
| 375 |
|
---|
| 376 | $this->Save();
|
---|
| 377 | }
|
---|
| 378 |
|
---|
| 379 | function GetMsnTime() {
|
---|
| 380 | return round($this->_msnEndTime - $this->_msnStartTime,2);
|
---|
| 381 | }
|
---|
| 382 |
|
---|
| 383 | function GetMicrotimeFloat() {
|
---|
| 384 | list($usec, $sec) = explode(" ", microtime());
|
---|
| 385 | return ((float)$usec + (float)$sec);
|
---|
| 386 | }
|
---|
| 387 | }
|
---|
| 388 |
|
---|
| 389 | /**
|
---|
| 390 | * Represents an item in the page list
|
---|
| 391 | * @author Arne Brachhold
|
---|
| 392 | * @package sitemap
|
---|
| 393 | * @since 3.0
|
---|
| 394 | */
|
---|
| 395 | class GoogleSitemapGeneratorPage {
|
---|
| 396 |
|
---|
| 397 | /**
|
---|
| 398 | * @var string $_url Sets the URL or the relative path to the blog dir of the page
|
---|
| 399 | * @access private
|
---|
| 400 | */
|
---|
| 401 | var $_url;
|
---|
| 402 |
|
---|
| 403 | /**
|
---|
| 404 | * @var float $_priority Sets the priority of this page
|
---|
| 405 | * @access private
|
---|
| 406 | */
|
---|
| 407 | var $_priority;
|
---|
| 408 |
|
---|
| 409 | /**
|
---|
| 410 | * @var string $_changeFreq Sets the chanfe frequency of the page. I want Enums!
|
---|
| 411 | * @access private
|
---|
| 412 | */
|
---|
| 413 | var $_changeFreq;
|
---|
| 414 |
|
---|
| 415 | /**
|
---|
| 416 | * @var int $_lastMod Sets the lastMod date as a UNIX timestamp.
|
---|
| 417 | * @access private
|
---|
| 418 | */
|
---|
| 419 | var $_lastMod;
|
---|
| 420 |
|
---|
| 421 | /**
|
---|
| 422 | * Initialize a new page object
|
---|
| 423 | *
|
---|
| 424 | * @since 3.0
|
---|
| 425 | * @access public
|
---|
| 426 | * @author Arne Brachhold
|
---|
| 427 | * @param bool $enabled Should this page be included in thesitemap
|
---|
| 428 | * @param string $url The URL or path of the file
|
---|
| 429 | * @param float $priority The Priority of the page 0.0 to 1.0
|
---|
| 430 | * @param string $changeFreq The change frequency like daily, hourly, weekly
|
---|
| 431 | * @param int $lastMod The last mod date as a unix timestamp
|
---|
| 432 | */
|
---|
| 433 | function GoogleSitemapGeneratorPage($url="",$priority=0.0,$changeFreq="never",$lastMod=0) {
|
---|
| 434 | $this->SetUrl($url);
|
---|
| 435 | $this->SetProprity($priority);
|
---|
| 436 | $this->SetChangeFreq($changeFreq);
|
---|
| 437 | $this->SetLastMod($lastMod);
|
---|
| 438 | }
|
---|
| 439 |
|
---|
| 440 | /**
|
---|
| 441 | * Returns the URL of the page
|
---|
| 442 | *
|
---|
| 443 | * @return string The URL
|
---|
| 444 | */
|
---|
| 445 | function GetUrl() {
|
---|
| 446 | return $this->_url;
|
---|
| 447 | }
|
---|
| 448 |
|
---|
| 449 | /**
|
---|
| 450 | * Sets the URL of the page
|
---|
| 451 | *
|
---|
| 452 | * @param string $url The new URL
|
---|
| 453 | */
|
---|
| 454 | function SetUrl($url) {
|
---|
| 455 | $this->_url=(string) $url;
|
---|
| 456 | }
|
---|
| 457 |
|
---|
| 458 | /**
|
---|
| 459 | * Returns the priority of this page
|
---|
| 460 | *
|
---|
| 461 | * @return float the priority, from 0.0 to 1.0
|
---|
| 462 | */
|
---|
| 463 | function GetPriority() {
|
---|
| 464 | return $this->_priority;
|
---|
| 465 | }
|
---|
| 466 |
|
---|
| 467 | /**
|
---|
| 468 | * Sets the priority of the page
|
---|
| 469 | *
|
---|
| 470 | * @param float $priority The new priority from 0.1 to 1.0
|
---|
| 471 | */
|
---|
| 472 | function SetProprity($priority) {
|
---|
| 473 | $this->_priority=floatval($priority);
|
---|
| 474 | }
|
---|
| 475 |
|
---|
| 476 | /**
|
---|
| 477 | * Returns the change frequency of the page
|
---|
| 478 | *
|
---|
| 479 | * @return string The change frequncy like hourly, weekly, monthly etc.
|
---|
| 480 | */
|
---|
| 481 | function GetChangeFreq() {
|
---|
| 482 | return $this->_changeFreq;
|
---|
| 483 | }
|
---|
| 484 |
|
---|
| 485 | /**
|
---|
| 486 | * Sets the change frequency of the page
|
---|
| 487 | *
|
---|
| 488 | * @param string $changeFreq The new change frequency
|
---|
| 489 | */
|
---|
| 490 | function SetChangeFreq($changeFreq) {
|
---|
| 491 | $this->_changeFreq=(string) $changeFreq;
|
---|
| 492 | }
|
---|
| 493 |
|
---|
| 494 | /**
|
---|
| 495 | * Returns the last mod of the page
|
---|
| 496 | *
|
---|
| 497 | * @return int The lastmod value in seconds
|
---|
| 498 | */
|
---|
| 499 | function GetLastMod() {
|
---|
| 500 | return $this->_lastMod;
|
---|
| 501 | }
|
---|
| 502 |
|
---|
| 503 | /**
|
---|
| 504 | * Sets the last mod of the page
|
---|
| 505 | *
|
---|
| 506 | * @param int $lastMod The lastmod of the page
|
---|
| 507 | */
|
---|
| 508 | function SetLastMod($lastMod) {
|
---|
| 509 | $this->_lastMod=intval($lastMod);
|
---|
| 510 | }
|
---|
| 511 |
|
---|
| 512 | function Render() {
|
---|
| 513 |
|
---|
| 514 | if($this->_url == "/" || empty($this->_url)) return '';
|
---|
| 515 |
|
---|
| 516 | $r="";
|
---|
| 517 | $r.= "\t<url>\n";
|
---|
| 518 | $r.= "\t\t<loc>" . $this->EscapeXML($this->_url) . "</loc>\n";
|
---|
| 519 | if($this->_lastMod>0) $r.= "\t\t<lastmod>" . date('Y-m-d\TH:i:s+00:00',$this->_lastMod) . "</lastmod>\n";
|
---|
| 520 | if(!empty($this->_changeFreq)) $r.= "\t\t<changefreq>" . $this->_changeFreq . "</changefreq>\n";
|
---|
| 521 | if($this->_priority!==false && $this->_priority!=="") $r.= "\t\t<priority>" . number_format($this->_priority,1) . "</priority>\n";
|
---|
| 522 | $r.= "\t</url>\n";
|
---|
| 523 | return $r;
|
---|
| 524 | }
|
---|
| 525 |
|
---|
| 526 | function EscapeXML($string) {
|
---|
| 527 | return str_replace ( array ( '&', '"', "'", '<', '>'), array ( '&' , '"', ''' , '<' , '>'), $string);
|
---|
| 528 | }
|
---|
| 529 | }
|
---|
| 530 |
|
---|
| 531 | class GoogleSitemapGeneratorXmlEntry {
|
---|
| 532 |
|
---|
| 533 | var $_xml;
|
---|
| 534 |
|
---|
| 535 | function GoogleSitemapGeneratorXmlEntry($xml) {
|
---|
| 536 | $this->_xml = $xml;
|
---|
| 537 | }
|
---|
| 538 |
|
---|
| 539 | function Render() {
|
---|
| 540 | return $this->_xml;
|
---|
| 541 | }
|
---|
| 542 | }
|
---|
| 543 |
|
---|
| 544 | class GoogleSitemapGeneratorDebugEntry extends GoogleSitemapGeneratorXmlEntry {
|
---|
| 545 |
|
---|
| 546 | function Render() {
|
---|
| 547 | return "<!-- " . $this->_xml . " -->";
|
---|
| 548 | }
|
---|
| 549 | }
|
---|
| 550 |
|
---|
| 551 | /**
|
---|
| 552 | * Base class for all priority providers
|
---|
| 553 | * @author Arne Brachhold
|
---|
| 554 | * @package sitemap
|
---|
| 555 | * @since 3.0
|
---|
| 556 | */
|
---|
| 557 | class GoogleSitemapGeneratorPrioProviderBase {
|
---|
| 558 |
|
---|
| 559 | /**
|
---|
| 560 | * @var int $_totalComments The total number of comments of all posts
|
---|
| 561 | * @access protected
|
---|
| 562 | */
|
---|
| 563 | var $_totalComments=0;
|
---|
| 564 |
|
---|
| 565 | /**
|
---|
| 566 | * @var int $_totalComments The total number of posts
|
---|
| 567 | * @access protected
|
---|
| 568 | */
|
---|
| 569 | var $_totalPosts=0;
|
---|
| 570 |
|
---|
| 571 | /**
|
---|
| 572 | * Returns the (translated) name of this priority provider
|
---|
| 573 | *
|
---|
| 574 | * @since 3.0
|
---|
| 575 | * @access public
|
---|
| 576 | * @author Arne Brachhold
|
---|
| 577 | * @return string The translated name
|
---|
| 578 | */
|
---|
| 579 | function GetName() {
|
---|
| 580 | return "";
|
---|
| 581 | }
|
---|
| 582 |
|
---|
| 583 | /**
|
---|
| 584 | * Returns the (translated) description of this priority provider
|
---|
| 585 | *
|
---|
| 586 | * @since 3.0
|
---|
| 587 | * @access public
|
---|
| 588 | * @author Arne Brachhold
|
---|
| 589 | * @return string The translated description
|
---|
| 590 | */
|
---|
| 591 | function GetDescription() {
|
---|
| 592 | return "";
|
---|
| 593 | }
|
---|
| 594 |
|
---|
| 595 | /**
|
---|
| 596 | * Initializes a new priority provider
|
---|
| 597 | *
|
---|
| 598 | * @param $totalComments int The total number of comments of all posts
|
---|
| 599 | * @param $totalPosts int The total number of posts
|
---|
| 600 | * @since 3.0
|
---|
| 601 | * @access public
|
---|
| 602 | * @author Arne Brachhold
|
---|
| 603 | */
|
---|
| 604 | function GoogleSitemapGeneratorPrioProviderBase($totalComments,$totalPosts) {
|
---|
| 605 | $this->_totalComments=$totalComments;
|
---|
| 606 | $this->_totalPosts=$totalPosts;
|
---|
| 607 |
|
---|
| 608 | }
|
---|
| 609 |
|
---|
| 610 | /**
|
---|
| 611 | * Returns the priority for a specified post
|
---|
| 612 | *
|
---|
| 613 | * @param $postID int The ID of the post
|
---|
| 614 | * @param $commentCount int The number of comments for this post
|
---|
| 615 | * @since 3.0
|
---|
| 616 | * @access public
|
---|
| 617 | * @author Arne Brachhold
|
---|
| 618 | * @return int The calculated priority
|
---|
| 619 | */
|
---|
| 620 | function GetPostPriority($postID,$commentCount) {
|
---|
| 621 | return 0;
|
---|
| 622 | }
|
---|
| 623 | }
|
---|
| 624 |
|
---|
| 625 | /**
|
---|
| 626 | * Priority Provider which calculates the priority based on the number of comments
|
---|
| 627 | * @author Arne Brachhold
|
---|
| 628 | * @package sitemap
|
---|
| 629 | * @since 3.0
|
---|
| 630 | */
|
---|
| 631 | class GoogleSitemapGeneratorPrioByCountProvider extends GoogleSitemapGeneratorPrioProviderBase {
|
---|
| 632 |
|
---|
| 633 | /**
|
---|
| 634 | * Returns the (translated) name of this priority provider
|
---|
| 635 | *
|
---|
| 636 | * @since 3.0
|
---|
| 637 | * @access public
|
---|
| 638 | * @author Arne Brachhold
|
---|
| 639 | * @return string The translated name
|
---|
| 640 | */
|
---|
| 641 | function GetName() {
|
---|
| 642 | return __("Comment Count",'sitemap');
|
---|
| 643 | }
|
---|
| 644 |
|
---|
| 645 | /**
|
---|
| 646 | * Returns the (translated) description of this priority provider
|
---|
| 647 | *
|
---|
| 648 | * @since 3.0
|
---|
| 649 | * @access public
|
---|
| 650 | * @author Arne Brachhold
|
---|
| 651 | * @return string The translated description
|
---|
| 652 | */
|
---|
| 653 | function GetDescription() {
|
---|
| 654 | return __("Uses the number of comments of the post to calculate the priority",'sitemap');
|
---|
| 655 | }
|
---|
| 656 |
|
---|
| 657 | /**
|
---|
| 658 | * Initializes a new priority provider which calculates the post priority based on the number of comments
|
---|
| 659 | *
|
---|
| 660 | * @param $totalComments int The total number of comments of all posts
|
---|
| 661 | * @param $totalPosts int The total number of posts
|
---|
| 662 | * @since 3.0
|
---|
| 663 | * @access public
|
---|
| 664 | * @author Arne Brachhold
|
---|
| 665 | */
|
---|
| 666 | function GoogleSitemapGeneratorPrioByCountProvider($totalComments,$totalPosts) {
|
---|
| 667 | parent::GoogleSitemapGeneratorPrioProviderBase($totalComments,$totalPosts);
|
---|
| 668 | }
|
---|
| 669 |
|
---|
| 670 | /**
|
---|
| 671 | * Returns the priority for a specified post
|
---|
| 672 | *
|
---|
| 673 | * @param $postID int The ID of the post
|
---|
| 674 | * @param $commentCount int The number of comments for this post
|
---|
| 675 | * @since 3.0
|
---|
| 676 | * @access public
|
---|
| 677 | * @author Arne Brachhold
|
---|
| 678 | * @return int The calculated priority
|
---|
| 679 | */
|
---|
| 680 | function GetPostPriority($postID,$commentCount) {
|
---|
| 681 | $prio=0;
|
---|
| 682 | if($this->_totalComments>0 && $commentCount>0) {
|
---|
| 683 | $prio = round(($commentCount*100/$this->_totalComments)/100,1);
|
---|
| 684 | } else {
|
---|
| 685 | $prio = 0;
|
---|
| 686 | }
|
---|
| 687 | return $prio;
|
---|
| 688 | }
|
---|
| 689 | }
|
---|
| 690 |
|
---|
| 691 | /**
|
---|
| 692 | * Priority Provider which calculates the priority based on the average number of comments
|
---|
| 693 | * @author Arne Brachhold
|
---|
| 694 | * @package sitemap
|
---|
| 695 | * @since 3.0
|
---|
| 696 | */
|
---|
| 697 | class GoogleSitemapGeneratorPrioByAverageProvider extends GoogleSitemapGeneratorPrioProviderBase {
|
---|
| 698 |
|
---|
| 699 | /**
|
---|
| 700 | * @var int $_average The average number of comments per post
|
---|
| 701 | * @access protected
|
---|
| 702 | */
|
---|
| 703 | var $_average=0.0;
|
---|
| 704 |
|
---|
| 705 | /**
|
---|
| 706 | * Returns the (translated) name of this priority provider
|
---|
| 707 | *
|
---|
| 708 | * @since 3.0
|
---|
| 709 | * @access public
|
---|
| 710 | * @author Arne Brachhold
|
---|
| 711 | * @return string The translated name
|
---|
| 712 | */
|
---|
| 713 | function GetName() {
|
---|
| 714 | return __("Comment Average",'sitemap');
|
---|
| 715 | }
|
---|
| 716 |
|
---|
| 717 | /**
|
---|
| 718 | * Returns the (translated) description of this priority provider
|
---|
| 719 | *
|
---|
| 720 | * @since 3.0
|
---|
| 721 | * @access public
|
---|
| 722 | * @author Arne Brachhold
|
---|
| 723 | * @return string The translated description
|
---|
| 724 | */
|
---|
| 725 | function GetDescription() {
|
---|
| 726 | return __("Uses the average comment count to calculate the priority",'sitemap');
|
---|
| 727 | }
|
---|
| 728 |
|
---|
| 729 | /**
|
---|
| 730 | * Initializes a new priority provider which calculates the post priority based on the average number of comments
|
---|
| 731 | *
|
---|
| 732 | * @param $totalComments int The total number of comments of all posts
|
---|
| 733 | * @param $totalPosts int The total number of posts
|
---|
| 734 | * @since 3.0
|
---|
| 735 | * @access public
|
---|
| 736 | * @author Arne Brachhold
|
---|
| 737 | */
|
---|
| 738 | function GoogleSitemapGeneratorPrioByAverageProvider($totalComments,$totalPosts) {
|
---|
| 739 | parent::GoogleSitemapGeneratorPrioProviderBase($totalComments,$totalPosts);
|
---|
| 740 |
|
---|
| 741 | if($this->_totalComments>0 && $this->_totalPosts>0) {
|
---|
| 742 | $this->_average= (double) $this->_totalComments / $this->_totalPosts;
|
---|
| 743 | }
|
---|
| 744 | }
|
---|
| 745 |
|
---|
| 746 | /**
|
---|
| 747 | * Returns the priority for a specified post
|
---|
| 748 | *
|
---|
| 749 | * @param $postID int The ID of the post
|
---|
| 750 | * @param $commentCount int The number of comments for this post
|
---|
| 751 | * @since 3.0
|
---|
| 752 | * @access public
|
---|
| 753 | * @author Arne Brachhold
|
---|
| 754 | * @return int The calculated priority
|
---|
| 755 | */
|
---|
| 756 | function GetPostPriority($postID,$commentCount) {
|
---|
| 757 | $prio = 0;
|
---|
| 758 | //Do not divide by zero!
|
---|
| 759 | if($this->_average==0) {
|
---|
| 760 | if($commentCount>0) $prio = 1;
|
---|
| 761 | else $prio = 0;
|
---|
| 762 | } else {
|
---|
| 763 | $prio = $commentCount/$this->_average;
|
---|
| 764 | if($prio>1) $prio = 1;
|
---|
| 765 | else if($prio<0) $prio = 0;
|
---|
| 766 | }
|
---|
| 767 |
|
---|
| 768 | return round($prio,1);
|
---|
| 769 | }
|
---|
| 770 | }
|
---|
| 771 |
|
---|
| 772 | /**
|
---|
| 773 | * Priority Provider which calculates the priority based on the popularity by the PopularityContest Plugin
|
---|
| 774 | * @author Arne Brachhold
|
---|
| 775 | * @package sitemap
|
---|
| 776 | * @since 3.0
|
---|
| 777 | */
|
---|
| 778 | class GoogleSitemapGeneratorPrioByPopularityContestProvider extends GoogleSitemapGeneratorPrioProviderBase {
|
---|
| 779 |
|
---|
| 780 | /**
|
---|
| 781 | * Returns the (translated) name of this priority provider
|
---|
| 782 | *
|
---|
| 783 | * @since 3.0
|
---|
| 784 | * @access public
|
---|
| 785 | * @author Arne Brachhold
|
---|
| 786 | * @return string The translated name
|
---|
| 787 | */
|
---|
| 788 | function GetName() {
|
---|
| 789 | return __("Popularity Contest",'sitemap');
|
---|
| 790 | }
|
---|
| 791 |
|
---|
| 792 | /**
|
---|
| 793 | * Returns the (translated) description of this priority provider
|
---|
| 794 | *
|
---|
| 795 | * @since 3.0
|
---|
| 796 | * @access public
|
---|
| 797 | * @author Arne Brachhold
|
---|
| 798 | * @return string The translated description
|
---|
| 799 | */
|
---|
| 800 | function GetDescription() {
|
---|
| 801 | return str_replace("%4","index.php?page=popularity-contest.php",str_replace("%3","options-general.php?page=popularity-contest.php",str_replace("%2","http://www.alexking.org/",str_replace("%1","http://www.alexking.org/index.php?content=software/wordpress/content.php",__("Uses the activated <a href=\"%1\">Popularity Contest Plugin</a> from <a href=\"%2\">Alex King</a>. See <a href=\"%3\">Settings</a> and <a href=\"%4\">Most Popular Posts</a>",'sitemap')))));
|
---|
| 802 | }
|
---|
| 803 |
|
---|
| 804 | /**
|
---|
| 805 | * Initializes a new priority provider which calculates the post priority based on the popularity by the PopularityContest Plugin
|
---|
| 806 | *
|
---|
| 807 | * @param $totalComments int The total number of comments of all posts
|
---|
| 808 | * @param $totalPosts int The total number of posts
|
---|
| 809 | * @since 3.0
|
---|
| 810 | * @access public
|
---|
| 811 | * @author Arne Brachhold
|
---|
| 812 | */
|
---|
| 813 | function GoogleSitemapGeneratorPrioByPopularityContestProvider($totalComments,$totalPosts) {
|
---|
| 814 | parent::GoogleSitemapGeneratorPrioProviderBase($totalComments,$totalPosts);
|
---|
| 815 | }
|
---|
| 816 |
|
---|
| 817 | /**
|
---|
| 818 | * Returns the priority for a specified post
|
---|
| 819 | *
|
---|
| 820 | * @param $postID int The ID of the post
|
---|
| 821 | * @param $commentCount int The number of comments for this post
|
---|
| 822 | * @since 3.0
|
---|
| 823 | * @access public
|
---|
| 824 | * @author Arne Brachhold
|
---|
| 825 | * @return int The calculated priority
|
---|
| 826 | */
|
---|
| 827 | function GetPostPriority($postID,$commentCount) {
|
---|
| 828 | //$akpc is the global instance of the Popularity Contest Plugin
|
---|
| 829 | global $akpc,$posts;
|
---|
| 830 |
|
---|
| 831 | $res=0;
|
---|
| 832 | //Better check if its there
|
---|
| 833 | if(!empty($akpc) && is_object($akpc)) {
|
---|
| 834 | //Is the method we rely on available?
|
---|
| 835 | if(method_exists($akpc,"get_post_rank")) {
|
---|
| 836 | if(!is_array($posts) || !$posts) $posts = array();
|
---|
| 837 | if(!isset($posts[$postID])) $posts[$postID] = get_post($postID);
|
---|
| 838 | //popresult comes as a percent value
|
---|
| 839 | $popresult=$akpc->get_post_rank($postID);
|
---|
| 840 | if(!empty($popresult) && strpos($popresult,"%")!==false) {
|
---|
| 841 | //We need to parse it to get the priority as an int (percent)
|
---|
| 842 | $matches=null;
|
---|
| 843 | preg_match("/([0-9]{1,3})\%/si",$popresult,$matches);
|
---|
| 844 | if(!empty($matches) && is_array($matches) && count($matches)==2) {
|
---|
| 845 | //Divide it so 100% = 1, 10% = 0.1
|
---|
| 846 | $res=round(intval($matches[1])/100,1);
|
---|
| 847 | }
|
---|
| 848 | }
|
---|
| 849 | }
|
---|
| 850 | }
|
---|
| 851 | return $res;
|
---|
| 852 | }
|
---|
| 853 | }
|
---|
| 854 |
|
---|
| 855 | /**
|
---|
| 856 | * Class to generate a sitemaps.org Sitemaps compliant sitemap of a WordPress blog.
|
---|
| 857 | *
|
---|
| 858 | * @package sitemap
|
---|
| 859 | * @author Arne Brachhold
|
---|
| 860 | * @since 3.0
|
---|
| 861 | */
|
---|
| 862 | class GoogleSitemapGenerator {
|
---|
| 863 | /**
|
---|
| 864 | * @var Version of the generator in SVN
|
---|
| 865 | */
|
---|
| 866 | var $_svnVersion = '$Id: sitemap-core.php 150610 2009-08-30 21:11:36Z arnee $';
|
---|
| 867 |
|
---|
| 868 | /**
|
---|
| 869 | * @var array The unserialized array with the stored options
|
---|
| 870 | */
|
---|
| 871 | var $_options = array();
|
---|
| 872 |
|
---|
| 873 | /**
|
---|
| 874 | * @var array The saved additional pages
|
---|
| 875 | */
|
---|
| 876 | var $_pages = array();
|
---|
| 877 |
|
---|
| 878 | /**
|
---|
| 879 | * @var array The values and names of the change frequencies
|
---|
| 880 | */
|
---|
| 881 | var $_freqNames = array();
|
---|
| 882 |
|
---|
| 883 | /**
|
---|
| 884 | * @var array A list of class names which my be called for priority calculation
|
---|
| 885 | */
|
---|
| 886 | var $_prioProviders = array();
|
---|
| 887 |
|
---|
| 888 | /**
|
---|
| 889 | * @var bool True if init complete (options loaded etc)
|
---|
| 890 | */
|
---|
| 891 | var $_initiated = false;
|
---|
| 892 |
|
---|
| 893 | /**
|
---|
| 894 | * @var string Holds the last error if one occurs when writing the files
|
---|
| 895 | */
|
---|
| 896 | var $_lastError=null;
|
---|
| 897 |
|
---|
| 898 | /**
|
---|
| 899 | * @var int The last handled post ID
|
---|
| 900 | */
|
---|
| 901 | var $_lastPostID = 0;
|
---|
| 902 |
|
---|
| 903 | /**
|
---|
| 904 | * @var bool Defines if the sitemap building process is active at the moment
|
---|
| 905 | */
|
---|
| 906 | var $_isActive = false;
|
---|
| 907 |
|
---|
| 908 | /**
|
---|
| 909 | * @var bool Defines if the sitemap building process has been scheduled via Wp cron
|
---|
| 910 | */
|
---|
| 911 | var $_isScheduled = false;
|
---|
| 912 |
|
---|
| 913 | /**
|
---|
| 914 | * @var object The file handle which is used to write the sitemap file
|
---|
| 915 | */
|
---|
| 916 | var $_fileHandle = null;
|
---|
| 917 |
|
---|
| 918 | /**
|
---|
| 919 | * @var object The file handle which is used to write the zipped sitemap file
|
---|
| 920 | */
|
---|
| 921 | var $_fileZipHandle = null;
|
---|
| 922 |
|
---|
| 923 | /**
|
---|
| 924 | * Returns the path to the blog directory
|
---|
| 925 | *
|
---|
| 926 | * @since 3.0
|
---|
| 927 | * @access private
|
---|
| 928 | * @author Arne Brachhold
|
---|
| 929 | * @return string The full path to the blog directory
|
---|
| 930 | */
|
---|
| 931 | function GetHomePath() {
|
---|
| 932 |
|
---|
| 933 | $res="";
|
---|
| 934 | //Check if we are in the admin area -> get_home_path() is avaiable
|
---|
| 935 | if(function_exists("get_home_path")) {
|
---|
| 936 | $res = get_home_path();
|
---|
| 937 | } else {
|
---|
| 938 | //get_home_path() is not available, but we can't include the admin
|
---|
| 939 | //libraries because many plugins check for the "check_admin_referer"
|
---|
| 940 | //function to detect if you are on an admin page. So we have to copy
|
---|
| 941 | //the get_home_path function in our own...
|
---|
| 942 | $home = get_option( 'home' );
|
---|
| 943 | if ( $home != '' && $home != get_option( 'siteurl' ) ) {
|
---|
| 944 | $home_path = parse_url( $home );
|
---|
| 945 | $home_path = $home_path['path'];
|
---|
| 946 | $root = str_replace( $_SERVER["PHP_SELF"], '', $_SERVER["SCRIPT_FILENAME"] );
|
---|
| 947 | $home_path = trailingslashit( $root.$home_path );
|
---|
| 948 | } else {
|
---|
| 949 | $home_path = ABSPATH;
|
---|
| 950 | }
|
---|
| 951 |
|
---|
| 952 | $res = $home_path;
|
---|
| 953 | }
|
---|
| 954 | return $res;
|
---|
| 955 | }
|
---|
| 956 |
|
---|
| 957 | /**
|
---|
| 958 | * Returns the path to the directory where the plugin file is located
|
---|
| 959 | * @since 3.0b5
|
---|
| 960 | * @access private
|
---|
| 961 | * @author Arne Brachhold
|
---|
| 962 | * @return string The path to the plugin directory
|
---|
| 963 | */
|
---|
| 964 | function GetPluginPath() {
|
---|
| 965 | $path = dirname(__FILE__);
|
---|
| 966 | return trailingslashit(str_replace("\\","/",$path));
|
---|
| 967 | }
|
---|
| 968 |
|
---|
| 969 | /**
|
---|
| 970 | * Returns the URL to the directory where the plugin file is located
|
---|
| 971 | * @since 3.0b5
|
---|
| 972 | * @access private
|
---|
| 973 | * @author Arne Brachhold
|
---|
| 974 | * @return string The URL to the plugin directory
|
---|
| 975 | */
|
---|
| 976 | function GetPluginUrl() {
|
---|
| 977 |
|
---|
| 978 | //Try to use WP API if possible, introduced in WP 2.6
|
---|
| 979 | if (function_exists('plugins_url')) return trailingslashit(plugins_url(basename(dirname(__FILE__))));
|
---|
| 980 |
|
---|
| 981 | //Try to find manually... can't work if wp-content was renamed or is redirected
|
---|
| 982 | $path = dirname(__FILE__);
|
---|
| 983 | $path = str_replace("\\","/",$path);
|
---|
| 984 | $path = trailingslashit(get_bloginfo('wpurl')) . trailingslashit(substr($path,strpos($path,"wp-content/")));
|
---|
| 985 | return $path;
|
---|
| 986 | }
|
---|
| 987 |
|
---|
| 988 | /**
|
---|
| 989 | * Returns the URL to default XSLT style if it exists
|
---|
| 990 | * @since 3.0b5
|
---|
| 991 | * @access private
|
---|
| 992 | * @author Arne Brachhold
|
---|
| 993 | * @return string The URL to the default stylesheet, empty string if not available.
|
---|
| 994 | */
|
---|
| 995 | function GetDefaultStyle() {
|
---|
| 996 | $p = $this->GetPluginPath();
|
---|
| 997 | if(file_exists($p . "sitemap.xsl")) {
|
---|
| 998 | $url = $this->GetPluginUrl();
|
---|
| 999 | //If called over the admin area using HTTPS, the stylesheet would also be https url, even if the blog frontend is not.
|
---|
| 1000 | if(substr(get_bloginfo('url'),0,5) !="https" && substr($url,0,5)=="https") $url="http" . substr($url,5);
|
---|
| 1001 | return $url . 'sitemap.xsl';
|
---|
| 1002 | }
|
---|
| 1003 | return '';
|
---|
| 1004 | }
|
---|
| 1005 |
|
---|
| 1006 | /**
|
---|
| 1007 | * Sets up the default configuration
|
---|
| 1008 | *
|
---|
| 1009 | * @since 3.0
|
---|
| 1010 | * @access private
|
---|
| 1011 | * @author Arne Brachhold
|
---|
| 1012 | */
|
---|
| 1013 | function InitOptions() {
|
---|
| 1014 |
|
---|
| 1015 | $this->_options=array();
|
---|
| 1016 | $this->_options["sm_b_prio_provider"]="GoogleSitemapGeneratorPrioByCountProvider"; //Provider for automatic priority calculation
|
---|
| 1017 | $this->_options["sm_b_filename"]="sitemap.xml"; //Name of the Sitemap file
|
---|
| 1018 | $this->_options["sm_b_debug"]=true; //Write debug messages in the xml file
|
---|
| 1019 | $this->_options["sm_b_xml"]=true; //Create a .xml file
|
---|
| 1020 | $this->_options["sm_b_gzip"]=true; //Create a gzipped .xml file(.gz) file
|
---|
| 1021 | $this->_options["sm_b_ping"]=true; //Auto ping Google
|
---|
| 1022 | $this->_options["sm_b_pingyahoo"]=false; //Auto ping YAHOO
|
---|
| 1023 | $this->_options["sm_b_yahookey"]=''; //YAHOO Application Key
|
---|
| 1024 | $this->_options["sm_b_pingask"]=true; //Auto ping Ask.com
|
---|
| 1025 | $this->_options["sm_b_pingmsn"]=true; //Auto ping MSN
|
---|
| 1026 | $this->_options["sm_b_manual_enabled"]=false; //Allow manual creation of the sitemap via GET request
|
---|
| 1027 | $this->_options["sm_b_auto_enabled"]=true; //Rebuild sitemap when content is changed
|
---|
| 1028 | $this->_options["sm_b_auto_delay"]=true; //Use WP Cron to execute the building process in the background
|
---|
| 1029 | $this->_options["sm_b_manual_key"]=md5(microtime());//The secret key to build the sitemap via GET request
|
---|
| 1030 | $this->_options["sm_b_memory"] = ''; //Set Memory Limit (e.g. 16M)
|
---|
| 1031 | $this->_options["sm_b_time"] = -1; //Set time limit in seconds, 0 for unlimited, -1 for disabled
|
---|
| 1032 | $this->_options["sm_b_max_posts"] = -1; //Maximum number of posts, <= 0 for all
|
---|
| 1033 | $this->_options["sm_b_safemode"] = false; //Enable MySQL Safe Mode (doesn't use unbuffered results)
|
---|
| 1034 | $this->_options["sm_b_style_default"] = true; //Use default style
|
---|
| 1035 | $this->_options["sm_b_style"] = ''; //Include a stylesheet in the XML
|
---|
| 1036 | $this->_options["sm_b_robots"] = true; //Add sitemap location to WordPress' virtual robots.txt file
|
---|
| 1037 | $this->_options["sm_b_exclude"] = array(); //List of post / page IDs to exclude
|
---|
| 1038 | $this->_options["sm_b_exclude_cats"] = array(); //List of post / page IDs to exclude
|
---|
| 1039 | $this->_options["sm_b_location_mode"]="auto"; //Mode of location, auto or manual
|
---|
| 1040 | $this->_options["sm_b_filename_manual"]=""; //Manuel filename
|
---|
| 1041 | $this->_options["sm_b_fileurl_manual"]=""; //Manuel fileurl
|
---|
| 1042 |
|
---|
| 1043 | $this->_options["sm_in_home"]=true; //Include homepage
|
---|
| 1044 | $this->_options["sm_in_posts"]=true; //Include posts
|
---|
| 1045 | $this->_options["sm_in_posts_sub"]=false; //Include post pages (<!--nextpage--> tag)
|
---|
| 1046 | $this->_options["sm_in_pages"]=true; //Include static pages
|
---|
| 1047 | $this->_options["sm_in_cats"]=false; //Include categories
|
---|
| 1048 | $this->_options["sm_in_arch"]=false; //Include archives
|
---|
| 1049 | $this->_options["sm_in_auth"]=false; //Include author pages
|
---|
| 1050 | $this->_options["sm_in_tags"]=false; //Include tag pages
|
---|
| 1051 | $this->_options["sm_in_lastmod"]=true; //Include the last modification date
|
---|
| 1052 |
|
---|
| 1053 | $this->_options["sm_cf_home"]="daily"; //Change frequency of the homepage
|
---|
| 1054 | $this->_options["sm_cf_posts"]="monthly"; //Change frequency of posts
|
---|
| 1055 | $this->_options["sm_cf_pages"]="weekly"; //Change frequency of static pages
|
---|
| 1056 | $this->_options["sm_cf_cats"]="weekly"; //Change frequency of categories
|
---|
| 1057 | $this->_options["sm_cf_auth"]="weekly"; //Change frequency of author pages
|
---|
| 1058 | $this->_options["sm_cf_arch_curr"]="daily"; //Change frequency of the current archive (this month)
|
---|
| 1059 | $this->_options["sm_cf_arch_old"]="yearly"; //Change frequency of older archives
|
---|
| 1060 | $this->_options["sm_cf_tags"]="weekly"; //Change frequency of tags
|
---|
| 1061 |
|
---|
| 1062 | $this->_options["sm_pr_home"]=1.0; //Priority of the homepage
|
---|
| 1063 | $this->_options["sm_pr_posts"]=0.6; //Priority of posts (if auto prio is disabled)
|
---|
| 1064 | $this->_options["sm_pr_posts_min"]=0.2; //Minimum Priority of posts, even if autocalc is enabled
|
---|
| 1065 | $this->_options["sm_pr_pages"]=0.6; //Priority of static pages
|
---|
| 1066 | $this->_options["sm_pr_cats"]=0.3; //Priority of categories
|
---|
| 1067 | $this->_options["sm_pr_arch"]=0.3; //Priority of archives
|
---|
| 1068 | $this->_options["sm_pr_auth"]=0.3; //Priority of author pages
|
---|
| 1069 | $this->_options["sm_pr_tags"]=0.3; //Priority of tags
|
---|
| 1070 |
|
---|
| 1071 | $this->_options["sm_i_donated"]=false; //Did you donate? Thank you! :)
|
---|
| 1072 | $this->_options["sm_i_hide_donated"]=false; //And hide the thank you..
|
---|
| 1073 | $this->_options["sm_i_install_date"]=time(); //The installation date
|
---|
| 1074 | $this->_options["sm_i_hide_note"]=false; //Hide the note which appears after 30 days
|
---|
| 1075 | $this->_options["sm_i_hide_donors"]=false; //Hide the list of donations
|
---|
| 1076 | }
|
---|
| 1077 |
|
---|
| 1078 | /**
|
---|
| 1079 | * Loads the configuration from the database
|
---|
| 1080 | *
|
---|
| 1081 | * @since 3.0
|
---|
| 1082 | * @access private
|
---|
| 1083 | * @author Arne Brachhold
|
---|
| 1084 | */
|
---|
| 1085 | function LoadOptions() {
|
---|
| 1086 |
|
---|
| 1087 | $this->InitOptions();
|
---|
| 1088 |
|
---|
| 1089 | //First init default values, then overwrite it with stored values so we can add default
|
---|
| 1090 | //values with an update which get stored by the next edit.
|
---|
| 1091 | $storedoptions=get_option("sm_options");
|
---|
| 1092 | if($storedoptions && is_array($storedoptions)) {
|
---|
| 1093 | foreach($storedoptions AS $k=>$v) {
|
---|
| 1094 | $this->_options[$k]=$v;
|
---|
| 1095 | }
|
---|
| 1096 | } else update_option("sm_options",$this->_options); //First time use, store default values
|
---|
| 1097 | }
|
---|
| 1098 |
|
---|
| 1099 | /**
|
---|
| 1100 | * Initializes a new Google Sitemap Generator
|
---|
| 1101 | *
|
---|
| 1102 | * @since 3.0
|
---|
| 1103 | * @access private
|
---|
| 1104 | * @author Arne Brachhold
|
---|
| 1105 | */
|
---|
| 1106 | function GoogleSitemapGenerator() {
|
---|
| 1107 |
|
---|
| 1108 |
|
---|
| 1109 |
|
---|
| 1110 |
|
---|
| 1111 | }
|
---|
| 1112 |
|
---|
| 1113 | /**
|
---|
| 1114 | * Returns the version of the generator
|
---|
| 1115 | *
|
---|
| 1116 | * @since 3.0
|
---|
| 1117 | * @access public
|
---|
| 1118 | * @author Arne Brachhold
|
---|
| 1119 | * @return int The version
|
---|
| 1120 | */
|
---|
| 1121 | function GetVersion() {
|
---|
| 1122 | return GoogleSitemapGeneratorLoader::GetVersion();
|
---|
| 1123 | }
|
---|
| 1124 |
|
---|
| 1125 | /**
|
---|
| 1126 | * Returns all parent classes of a class
|
---|
| 1127 | *
|
---|
| 1128 | * @param $className string The name of the class
|
---|
| 1129 | *
|
---|
| 1130 | * @since 3.0
|
---|
| 1131 | * @access private
|
---|
| 1132 | * @author Arne Brachhold
|
---|
| 1133 | * @return array An array which contains the names of the parent classes
|
---|
| 1134 | */
|
---|
| 1135 | function GetParentClasses($classname) {
|
---|
| 1136 | $parent = get_parent_class($classname);
|
---|
| 1137 | $parents = array();
|
---|
| 1138 | if (!empty($parent)) {
|
---|
| 1139 | $parents = $this->GetParentClasses($parent);
|
---|
| 1140 | $parents[] = strtolower($parent);
|
---|
| 1141 | }
|
---|
| 1142 | return $parents;
|
---|
| 1143 | }
|
---|
| 1144 |
|
---|
| 1145 | /**
|
---|
| 1146 | * Returns if a class is a subclass of another class
|
---|
| 1147 | *
|
---|
| 1148 | * @param $className string The name of the class
|
---|
| 1149 | * @param $$parentName string The name of the parent class
|
---|
| 1150 | *
|
---|
| 1151 | * @since 3.0
|
---|
| 1152 | * @access private
|
---|
| 1153 | * @author Arne Brachhold
|
---|
| 1154 | * @return bool true if the given class is a subclass of the other one
|
---|
| 1155 | */
|
---|
| 1156 | function IsSubclassOf($className, $parentName) {
|
---|
| 1157 |
|
---|
| 1158 | $className = strtolower($className);
|
---|
| 1159 | $parentName = strtolower($parentName);
|
---|
| 1160 |
|
---|
| 1161 | if(empty($className) || empty($parentName) || !class_exists($className) || !class_exists($parentName)) return false;
|
---|
| 1162 |
|
---|
| 1163 | $parents=$this->GetParentClasses($className);
|
---|
| 1164 |
|
---|
| 1165 | return in_array($parentName,$parents);
|
---|
| 1166 | }
|
---|
| 1167 |
|
---|
| 1168 | /**
|
---|
| 1169 | * Loads up the configuration and validates the prioity providers
|
---|
| 1170 | *
|
---|
| 1171 | * This method is only called if the sitemaps needs to be build or the admin page is displayed.
|
---|
| 1172 | *
|
---|
| 1173 | * @since 3.0
|
---|
| 1174 | * @access private
|
---|
| 1175 | * @author Arne Brachhold
|
---|
| 1176 | */
|
---|
| 1177 | function Initate() {
|
---|
| 1178 | if(!$this->_initiated) {
|
---|
| 1179 |
|
---|
| 1180 | //Loading language file...
|
---|
| 1181 | //load_plugin_textdomain('sitemap');
|
---|
| 1182 | //Hmm, doesn't work if the plugin file has its own directory.
|
---|
| 1183 | //Let's make it our way... load_plugin_textdomain() searches only in the wp-content/plugins dir.
|
---|
| 1184 | $currentLocale = get_locale();
|
---|
| 1185 | if(!empty($currentLocale)) {
|
---|
| 1186 | $moFile = dirname(__FILE__) . "/lang/sitemap-" . $currentLocale . ".mo";
|
---|
| 1187 | if(@file_exists($moFile) && is_readable($moFile)) load_textdomain('sitemap', $moFile);
|
---|
| 1188 | }
|
---|
| 1189 |
|
---|
| 1190 | $this->_freqNames = array(
|
---|
| 1191 | "always"=>__("Always","sitemap"),
|
---|
| 1192 | "hourly"=>__("Hourly","sitemap"),
|
---|
| 1193 | "daily"=>__("Daily","sitemap"),
|
---|
| 1194 | "weekly"=>__("Weekly","sitemap"),
|
---|
| 1195 | "monthly"=>__("Monthly","sitemap"),
|
---|
| 1196 | "yearly"=>__("Yearly","sitemap"),
|
---|
| 1197 | "never"=>__("Never","sitemap")
|
---|
| 1198 | );
|
---|
| 1199 |
|
---|
| 1200 |
|
---|
| 1201 | $this->LoadOptions();
|
---|
| 1202 | $this->LoadPages();
|
---|
| 1203 |
|
---|
| 1204 | //Register our own priority providers
|
---|
| 1205 | add_filter("sm_add_prio_provider",array(&$this, 'AddDefaultPrioProviders'));
|
---|
| 1206 |
|
---|
| 1207 | //Let other plugins register their providers
|
---|
| 1208 | $r = apply_filters("sm_add_prio_provider",$this->_prioProviders);
|
---|
| 1209 |
|
---|
| 1210 | //Check if no plugin return null
|
---|
| 1211 | if($r != null) $this->_prioProviders = $r;
|
---|
| 1212 |
|
---|
| 1213 | $this->ValidatePrioProviders();
|
---|
| 1214 |
|
---|
| 1215 | $this->_initiated = true;
|
---|
| 1216 | }
|
---|
| 1217 | }
|
---|
| 1218 |
|
---|
| 1219 | /**
|
---|
| 1220 | * Returns the instance of the Sitemap Generator
|
---|
| 1221 | *
|
---|
| 1222 | * @since 3.0
|
---|
| 1223 | * @access public
|
---|
| 1224 | * @return GoogleSitemapGenerator The instance or null if not available.
|
---|
| 1225 | * @author Arne Brachhold
|
---|
| 1226 | */
|
---|
| 1227 | function &GetInstance() {
|
---|
| 1228 | if(isset($GLOBALS["sm_instance"])) {
|
---|
| 1229 | return $GLOBALS["sm_instance"];
|
---|
| 1230 | } else return null;
|
---|
| 1231 | }
|
---|
| 1232 |
|
---|
| 1233 | /**
|
---|
| 1234 | * Returns if the sitemap building process is currently active
|
---|
| 1235 | *
|
---|
| 1236 | * @since 3.0
|
---|
| 1237 | * @access public
|
---|
| 1238 | * @return bool true if active
|
---|
| 1239 | * @author Arne Brachhold
|
---|
| 1240 | */
|
---|
| 1241 | function IsActive() {
|
---|
| 1242 | $inst = &GoogleSitemapGenerator::GetInstance();
|
---|
| 1243 | return ($inst != null && $inst->_isActive);
|
---|
| 1244 | }
|
---|
| 1245 |
|
---|
| 1246 | /**
|
---|
| 1247 | * Returns if the compressed sitemap was activated
|
---|
| 1248 | *
|
---|
| 1249 | * @since 3.0b8
|
---|
| 1250 | * @access private
|
---|
| 1251 | * @author Arne Brachhold
|
---|
| 1252 | * @return true if compressed
|
---|
| 1253 | */
|
---|
| 1254 | function IsGzipEnabled() {
|
---|
| 1255 | return ($this->GetOption("b_gzip")===true && function_exists("gzwrite"));
|
---|
| 1256 | }
|
---|
| 1257 |
|
---|
| 1258 | /**
|
---|
| 1259 | * Returns if this version of WordPress supports the new taxonomy system
|
---|
| 1260 | *
|
---|
| 1261 | * @since 3.0b8
|
---|
| 1262 | * @access private
|
---|
| 1263 | * @author Arne Brachhold
|
---|
| 1264 | * @return true if supported
|
---|
| 1265 | */
|
---|
| 1266 | function IsTaxonomySupported() {
|
---|
| 1267 | return (function_exists("get_taxonomy") && function_exists("get_terms"));
|
---|
| 1268 | }
|
---|
| 1269 |
|
---|
| 1270 | /**
|
---|
| 1271 | * Enables the Google Sitemap Generator and registers the WordPress hooks
|
---|
| 1272 | *
|
---|
| 1273 | * @since 3.0
|
---|
| 1274 | * @access public
|
---|
| 1275 | * @author Arne Brachhold
|
---|
| 1276 | */
|
---|
| 1277 | function Enable() {
|
---|
| 1278 | if(!isset($GLOBALS["sm_instance"])) {
|
---|
| 1279 | $GLOBALS["sm_instance"]=new GoogleSitemapGenerator();
|
---|
| 1280 | }
|
---|
| 1281 | }
|
---|
| 1282 |
|
---|
| 1283 | /**
|
---|
| 1284 | * Checks if sitemap building after content changed is enabled and rebuild the sitemap
|
---|
| 1285 | *
|
---|
| 1286 | * @param int $postID The ID of the post to handle. Used to avoid double rebuilding if more than one hook was fired.
|
---|
| 1287 | * @since 3.0
|
---|
| 1288 | * @access public
|
---|
| 1289 | * @author Arne Brachhold
|
---|
| 1290 | */
|
---|
| 1291 | function CheckForAutoBuild($postID) {
|
---|
| 1292 | global $wp_version;
|
---|
| 1293 | $this->Initate();
|
---|
| 1294 | //Build one time per post and if not importing.
|
---|
| 1295 | if($this->GetOption("b_auto_enabled")===true && $this->_lastPostID != $postID && (!defined('WP_IMPORTING') || WP_IMPORTING != true)) {
|
---|
| 1296 |
|
---|
| 1297 | //Build the sitemap directly or schedule it with WP cron
|
---|
| 1298 | if($this->GetOption("b_auto_delay")==true && floatval($wp_version) >= 2.1) {
|
---|
| 1299 | if(!$this->_isScheduled) {
|
---|
| 1300 | //Schedule in 15 seconds, this should be enough to catch all changes.
|
---|
| 1301 | //Clear all other existing hooks, so the sitemap is only built once.
|
---|
| 1302 | wp_clear_scheduled_hook('sm_build_cron');
|
---|
| 1303 | wp_schedule_single_event(time()+15,'sm_build_cron');
|
---|
| 1304 | $this->_isScheduled = true;
|
---|
| 1305 | }
|
---|
| 1306 | } else {
|
---|
| 1307 | //Build sitemap only once and never in bulk mode
|
---|
| 1308 | if(!$this->_lastPostID && (!isset($_GET["delete"]) || count((array) $_GET['delete'])<=0)) {
|
---|
| 1309 | $this->BuildSitemap();
|
---|
| 1310 | }
|
---|
| 1311 | }
|
---|
| 1312 | $this->_lastPostID = $postID;
|
---|
| 1313 | }
|
---|
| 1314 | }
|
---|
| 1315 |
|
---|
| 1316 | /**
|
---|
| 1317 | * Checks if the rebuild request was send and starts to rebuilt the sitemap
|
---|
| 1318 | *
|
---|
| 1319 | * @since 3.0
|
---|
| 1320 | * @access public
|
---|
| 1321 | * @author Arne Brachhold
|
---|
| 1322 | */
|
---|
| 1323 | function CheckForManualBuild() {
|
---|
| 1324 | if(!empty($_GET["sm_command"]) && !empty($_GET["sm_key"])) {
|
---|
| 1325 | $this->Initate();
|
---|
| 1326 | if($this->GetOption("b_manual_enabled")===true && $_GET["sm_command"]=="build" && $_GET["sm_key"]==$this->GetOption("b_manual_key")) {
|
---|
| 1327 | $this->BuildSitemap();
|
---|
| 1328 | echo "DONE";
|
---|
| 1329 | exit;
|
---|
| 1330 | }
|
---|
| 1331 | }
|
---|
| 1332 | }
|
---|
| 1333 |
|
---|
| 1334 | /**
|
---|
| 1335 | * Validates all given Priority Providers by checking them for required methods and existence
|
---|
| 1336 | *
|
---|
| 1337 | * @since 3.0
|
---|
| 1338 | * @access private
|
---|
| 1339 | * @author Arne Brachhold
|
---|
| 1340 | */
|
---|
| 1341 | function ValidatePrioProviders() {
|
---|
| 1342 | $validProviders=array();
|
---|
| 1343 |
|
---|
| 1344 | for($i=0; $i<count($this->_prioProviders); $i++) {
|
---|
| 1345 | if(class_exists($this->_prioProviders[$i])) {
|
---|
| 1346 | if($this->IsSubclassOf($this->_prioProviders[$i],"GoogleSitemapGeneratorPrioProviderBase")) {
|
---|
| 1347 | array_push($validProviders,$this->_prioProviders[$i]);
|
---|
| 1348 | }
|
---|
| 1349 | }
|
---|
| 1350 | }
|
---|
| 1351 | $this->_prioProviders=$validProviders;
|
---|
| 1352 |
|
---|
| 1353 | if(!$this->GetOption("b_prio_provider")) {
|
---|
| 1354 | if(!in_array($this->GetOption("b_prio_provider"),$this->_prioProviders,true)) {
|
---|
| 1355 | $this->SetOption("b_prio_provider","");
|
---|
| 1356 | }
|
---|
| 1357 | }
|
---|
| 1358 | }
|
---|
| 1359 |
|
---|
| 1360 | /**
|
---|
| 1361 | * Adds the default Priority Providers to the provider list
|
---|
| 1362 | *
|
---|
| 1363 | * @since 3.0
|
---|
| 1364 | * @access private
|
---|
| 1365 | * @author Arne Brachhold
|
---|
| 1366 | */
|
---|
| 1367 | function AddDefaultPrioProviders($providers) {
|
---|
| 1368 | array_push($providers,"GoogleSitemapGeneratorPrioByCountProvider");
|
---|
| 1369 | array_push($providers,"GoogleSitemapGeneratorPrioByAverageProvider");
|
---|
| 1370 | if(class_exists("ak_popularity_contest")) {
|
---|
| 1371 | array_push($providers,"GoogleSitemapGeneratorPrioByPopularityContestProvider");
|
---|
| 1372 | }
|
---|
| 1373 | return $providers;
|
---|
| 1374 | }
|
---|
| 1375 |
|
---|
| 1376 | /**
|
---|
| 1377 | * Loads the stored pages from the database
|
---|
| 1378 | *
|
---|
| 1379 | * @since 3.0
|
---|
| 1380 | * @access private
|
---|
| 1381 | * @author Arne Brachhold
|
---|
| 1382 | */
|
---|
| 1383 | function LoadPages() {
|
---|
| 1384 | global $wpdb;
|
---|
| 1385 |
|
---|
| 1386 | $needsUpdate=false;
|
---|
| 1387 |
|
---|
| 1388 | $pagesString=$wpdb->get_var("SELECT option_value FROM $wpdb->options WHERE option_name = 'sm_cpages'");
|
---|
| 1389 |
|
---|
| 1390 | //Class sm_page was renamed with 3.0 -> rename it in serialized value for compatibility
|
---|
| 1391 | if(!empty($pagesString) && strpos($pagesString,"sm_page")!==false) {
|
---|
| 1392 | $pagesString = str_replace("O:7:\"sm_page\"","O:26:\"GoogleSitemapGeneratorPage\"",$pagesString);
|
---|
| 1393 | $needsUpdate=true;
|
---|
| 1394 | }
|
---|
| 1395 |
|
---|
| 1396 | if(!empty($pagesString)) {
|
---|
| 1397 | $storedpages=unserialize($pagesString);
|
---|
| 1398 | $this->_pages=$storedpages;
|
---|
| 1399 | } else {
|
---|
| 1400 | $this->_pages=array();
|
---|
| 1401 | }
|
---|
| 1402 |
|
---|
| 1403 | if($needsUpdate) $this->SavePages();
|
---|
| 1404 | }
|
---|
| 1405 |
|
---|
| 1406 | /**
|
---|
| 1407 | * Saved the additional pages back to the database
|
---|
| 1408 | *
|
---|
| 1409 | * @since 3.0
|
---|
| 1410 | * @access private
|
---|
| 1411 | * @author Arne Brachhold
|
---|
| 1412 | * @return true on success
|
---|
| 1413 | */
|
---|
| 1414 | function SavePages() {
|
---|
| 1415 | $oldvalue = get_option("sm_cpages");
|
---|
| 1416 | if($oldvalue == $this->_pages) {
|
---|
| 1417 | return true;
|
---|
| 1418 | } else {
|
---|
| 1419 | delete_option("sm_cpages");
|
---|
| 1420 | //Add the option, Note the autoload=false because when the autoload happens, our class GoogleSitemapGeneratorPage doesn't exist
|
---|
| 1421 | add_option("sm_cpages",$this->_pages,"Storage for custom pages of the sitemap plugin","no");
|
---|
| 1422 | return true;
|
---|
| 1423 | }
|
---|
| 1424 | }
|
---|
| 1425 |
|
---|
| 1426 |
|
---|
| 1427 | /**
|
---|
| 1428 | * Returns the URL for the sitemap file
|
---|
| 1429 | *
|
---|
| 1430 | * @since 3.0
|
---|
| 1431 | * @access private
|
---|
| 1432 | * @author Arne Brachhold
|
---|
| 1433 | * @param bool $forceAuto Force the return value to the autodetected value.
|
---|
| 1434 | * @return The URL to the Sitemap file
|
---|
| 1435 | */
|
---|
| 1436 | function GetXmlUrl($forceAuto=false) {
|
---|
| 1437 |
|
---|
| 1438 | if(!$forceAuto && $this->GetOption("b_location_mode")=="manual") {
|
---|
| 1439 | return $this->GetOption("b_fileurl_manual");
|
---|
| 1440 | } else {
|
---|
| 1441 | return trailingslashit(get_bloginfo('siteurl')). $this->GetOption("b_filename");
|
---|
| 1442 | }
|
---|
| 1443 | }
|
---|
| 1444 |
|
---|
| 1445 | /**
|
---|
| 1446 | * Returns the URL for the gzipped sitemap file
|
---|
| 1447 | *
|
---|
| 1448 | * @since 3.0
|
---|
| 1449 | * @access private
|
---|
| 1450 | * @author Arne Brachhold
|
---|
| 1451 | * @param bool $forceAuto Force the return value to the autodetected value.
|
---|
| 1452 | * @return The URL to the gzipped Sitemap file
|
---|
| 1453 | */
|
---|
| 1454 | function GetZipUrl($forceAuto=false) {
|
---|
| 1455 | return $this->GetXmlUrl($forceAuto) . ".gz";
|
---|
| 1456 | }
|
---|
| 1457 |
|
---|
| 1458 | /**
|
---|
| 1459 | * Returns the file system path to the sitemap file
|
---|
| 1460 | *
|
---|
| 1461 | * @since 3.0
|
---|
| 1462 | * @access private
|
---|
| 1463 | * @author Arne Brachhold
|
---|
| 1464 | * @param bool $forceAuto Force the return value to the autodetected value.
|
---|
| 1465 | * @return The file system path;
|
---|
| 1466 | */
|
---|
| 1467 | function GetXmlPath($forceAuto=false) {
|
---|
| 1468 | if(!$forceAuto && $this->GetOption("b_location_mode")=="manual") {
|
---|
| 1469 | return $this->GetOption("b_filename_manual");
|
---|
| 1470 | } else {
|
---|
| 1471 | return $this->GetHomePath() . $this->GetOption("b_filename");
|
---|
| 1472 | }
|
---|
| 1473 | }
|
---|
| 1474 |
|
---|
| 1475 | /**
|
---|
| 1476 | * Returns the file system path to the gzipped sitemap file
|
---|
| 1477 | *
|
---|
| 1478 | * @since 3.0
|
---|
| 1479 | * @access private
|
---|
| 1480 | * @author Arne Brachhold
|
---|
| 1481 | * @param bool $forceAuto Force the return value to the autodetected value.
|
---|
| 1482 | * @return The file system path;
|
---|
| 1483 | */
|
---|
| 1484 | function GetZipPath($forceAuto=false) {
|
---|
| 1485 | return $this->GetXmlPath($forceAuto) . ".gz";
|
---|
| 1486 | }
|
---|
| 1487 |
|
---|
| 1488 | /**
|
---|
| 1489 | * Returns the option value for the given key
|
---|
| 1490 | *
|
---|
| 1491 | * @since 3.0
|
---|
| 1492 | * @access private
|
---|
| 1493 | * @author Arne Brachhold
|
---|
| 1494 | * @param $key string The Configuration Key
|
---|
| 1495 | * @return mixed The value
|
---|
| 1496 | */
|
---|
| 1497 | function GetOption($key) {
|
---|
| 1498 | $key="sm_" . $key;
|
---|
| 1499 | if(array_key_exists($key,$this->_options)) {
|
---|
| 1500 | return $this->_options[$key];
|
---|
| 1501 | } else return null;
|
---|
| 1502 | }
|
---|
| 1503 |
|
---|
| 1504 | /**
|
---|
| 1505 | * Sets an option to a new value
|
---|
| 1506 | *
|
---|
| 1507 | * @since 3.0
|
---|
| 1508 | * @access private
|
---|
| 1509 | * @author Arne Brachhold
|
---|
| 1510 | * @param $key string The configuration key
|
---|
| 1511 | * @param $value mixed The new object
|
---|
| 1512 | */
|
---|
| 1513 | function SetOption($key,$value) {
|
---|
| 1514 | if(strstr($key,"sm_")!==0) $key="sm_" . $key;
|
---|
| 1515 |
|
---|
| 1516 | $this->_options[$key]=$value;
|
---|
| 1517 | }
|
---|
| 1518 |
|
---|
| 1519 | /**
|
---|
| 1520 | * Saves the options back to the database
|
---|
| 1521 | *
|
---|
| 1522 | * @since 3.0
|
---|
| 1523 | * @access private
|
---|
| 1524 | * @author Arne Brachhold
|
---|
| 1525 | * @return bool true on success
|
---|
| 1526 | */
|
---|
| 1527 | function SaveOptions() {
|
---|
| 1528 | $oldvalue = get_option("sm_options");
|
---|
| 1529 | if($oldvalue == $this->_options) {
|
---|
| 1530 | return true;
|
---|
| 1531 | } else return update_option("sm_options",$this->_options);
|
---|
| 1532 | }
|
---|
| 1533 |
|
---|
| 1534 | /**
|
---|
| 1535 | * Retrieves the number of comments of a post in a asso. array
|
---|
| 1536 | * The key is the postID, the value the number of comments
|
---|
| 1537 | *
|
---|
| 1538 | * @since 3.0
|
---|
| 1539 | * @access private
|
---|
| 1540 | * @author Arne Brachhold
|
---|
| 1541 | * @return array An array with postIDs and their comment count
|
---|
| 1542 | */
|
---|
| 1543 | function GetComments() {
|
---|
| 1544 | global $wpdb;
|
---|
| 1545 | $comments=array();
|
---|
| 1546 |
|
---|
| 1547 | //Query comments and add them into the array
|
---|
| 1548 | $commentRes=$wpdb->get_results("SELECT `comment_post_ID` as `post_id`, COUNT(comment_ID) as `comment_count` FROM `" . $wpdb->comments . "` WHERE `comment_approved`='1' GROUP BY `comment_post_ID`");
|
---|
| 1549 | if($commentRes) {
|
---|
| 1550 | foreach($commentRes as $comment) {
|
---|
| 1551 | $comments[$comment->post_id]=$comment->comment_count;
|
---|
| 1552 | }
|
---|
| 1553 | }
|
---|
| 1554 | return $comments;
|
---|
| 1555 | }
|
---|
| 1556 |
|
---|
| 1557 | /**
|
---|
| 1558 | * Calculates the full number of comments from an sm_getComments() generated array
|
---|
| 1559 | *
|
---|
| 1560 | * @since 3.0
|
---|
| 1561 | * @access private
|
---|
| 1562 | * @author Arne Brachhold
|
---|
| 1563 | * @param $comments array The Array with posts and c0mment count
|
---|
| 1564 | * @see sm_getComments
|
---|
| 1565 | * @return The full number of comments
|
---|
| 1566 | */
|
---|
| 1567 | function GetCommentCount($comments) {
|
---|
| 1568 | $commentCount=0;
|
---|
| 1569 | foreach($comments AS $k=>$v) {
|
---|
| 1570 | $commentCount+=$v;
|
---|
| 1571 | }
|
---|
| 1572 | return $commentCount;
|
---|
| 1573 | }
|
---|
| 1574 |
|
---|
| 1575 | /**
|
---|
| 1576 | * Adds a url to the sitemap. You can use this method or call AddElement directly.
|
---|
| 1577 | *
|
---|
| 1578 | * @since 3.0
|
---|
| 1579 | * @access public
|
---|
| 1580 | * @author Arne Brachhold
|
---|
| 1581 | * @param $loc string The location (url) of the page
|
---|
| 1582 | * @param $lastMod int The last Modification time as a UNIX timestamp
|
---|
| 1583 | * @param $changeFreq string The change frequenty of the page, Valid values are "always", "hourly", "daily", "weekly", "monthly", "yearly" and "never".
|
---|
| 1584 | * @param $priorty float The priority of the page, between 0.0 and 1.0
|
---|
| 1585 | * @see AddElement
|
---|
| 1586 | * @return string The URL node
|
---|
| 1587 | */
|
---|
| 1588 | function AddUrl($loc, $lastMod = 0, $changeFreq = "monthly", $priority = 0.5) {
|
---|
| 1589 | //Strip out the last modification time if activated
|
---|
| 1590 | if($this->GetOption('in_lastmod')===false) $lastMod = 0;
|
---|
| 1591 | $page = new GoogleSitemapGeneratorPage($loc, $priority, $changeFreq, $lastMod);
|
---|
| 1592 |
|
---|
| 1593 | $this->AddElement($page);
|
---|
| 1594 | }
|
---|
| 1595 |
|
---|
| 1596 | /**
|
---|
| 1597 | * Adds an element to the sitemap
|
---|
| 1598 | *
|
---|
| 1599 | * @since 3.0
|
---|
| 1600 | * @access private
|
---|
| 1601 | * @author Arne Brachhold
|
---|
| 1602 | * @param $page The element
|
---|
| 1603 | */
|
---|
| 1604 | function AddElement(&$page) {
|
---|
| 1605 | if(empty($page)) return;
|
---|
| 1606 |
|
---|
| 1607 | $s = $page->Render();
|
---|
| 1608 |
|
---|
| 1609 | if($this->_fileZipHandle && $this->IsGzipEnabled()) {
|
---|
| 1610 | gzwrite($this->_fileZipHandle,$s);
|
---|
| 1611 | }
|
---|
| 1612 |
|
---|
| 1613 | if($this->_fileHandle && $this->GetOption("b_xml")) {
|
---|
| 1614 | fwrite($this->_fileHandle,$s);
|
---|
| 1615 | }
|
---|
| 1616 | }
|
---|
| 1617 |
|
---|
| 1618 | /**
|
---|
| 1619 | * Checks if a file is writable and tries to make it if not.
|
---|
| 1620 | *
|
---|
| 1621 | * @since 3.05b
|
---|
| 1622 | * @access private
|
---|
| 1623 | * @author VJTD3 <http://www.VJTD3.com>
|
---|
| 1624 | * @return bool true if writable
|
---|
| 1625 | */
|
---|
| 1626 | function IsFileWritable($filename) {
|
---|
| 1627 | //can we write?
|
---|
| 1628 | if(!is_writable($filename)) {
|
---|
| 1629 | //no we can't.
|
---|
| 1630 | if(!@chmod($filename, 0666)) {
|
---|
| 1631 | $pathtofilename = dirname($filename);
|
---|
| 1632 | //Lets check if parent directory is writable.
|
---|
| 1633 | if(!is_writable($pathtofilename)) {
|
---|
| 1634 | //it's not writeable too.
|
---|
| 1635 | if(!@chmod($pathtoffilename, 0666)) {
|
---|
| 1636 | //darn couldn't fix up parrent directory this hosting is foobar.
|
---|
| 1637 | //Lets error because of the permissions problems.
|
---|
| 1638 | return false;
|
---|
| 1639 | }
|
---|
| 1640 | }
|
---|
| 1641 | }
|
---|
| 1642 | }
|
---|
| 1643 | //we can write, return 1/true/happy dance.
|
---|
| 1644 | return true;
|
---|
| 1645 | }
|
---|
| 1646 |
|
---|
| 1647 | function DoRobots() {
|
---|
| 1648 | $this->Initate();
|
---|
| 1649 | if($this->GetOption('b_robots') === true) {
|
---|
| 1650 |
|
---|
| 1651 | $smUrl = $this->GetXmlUrl();
|
---|
| 1652 | if($this->IsGzipEnabled()) {
|
---|
| 1653 | $smUrl = $this->GetZipUrl();
|
---|
| 1654 | }
|
---|
| 1655 |
|
---|
| 1656 | echo "\nSitemap: " . $smUrl . "\n";
|
---|
| 1657 |
|
---|
| 1658 | }
|
---|
| 1659 | }
|
---|
| 1660 |
|
---|
| 1661 | /**
|
---|
| 1662 | * Builds the sitemap and writes it into a xml file.
|
---|
| 1663 | *
|
---|
| 1664 | * @since 3.0
|
---|
| 1665 | * @access public
|
---|
| 1666 | * @author Arne Brachhold <himself [at] arnebrachhold [dot] de>
|
---|
| 1667 | * @return array An array with messages such as failed writes etc.
|
---|
| 1668 | */
|
---|
| 1669 | function BuildSitemap() {
|
---|
| 1670 | global $wpdb, $posts, $wp_version;
|
---|
| 1671 | $this->Initate();
|
---|
| 1672 |
|
---|
| 1673 | if($this->GetOption("b_memory")!='') {
|
---|
| 1674 | @ini_set("memory_limit",$this->GetOption("b_memory"));
|
---|
| 1675 | }
|
---|
| 1676 |
|
---|
| 1677 | if($this->GetOption("b_time")!=-1) {
|
---|
| 1678 | @set_time_limit($this->GetOption("b_time"));
|
---|
| 1679 | }
|
---|
| 1680 |
|
---|
| 1681 | //This object saves the status information of the script directly to the database
|
---|
| 1682 | $status = new GoogleSitemapGeneratorStatus();
|
---|
| 1683 |
|
---|
| 1684 | //Other plugins can detect if the building process is active
|
---|
| 1685 | $this->_isActive = true;
|
---|
| 1686 |
|
---|
| 1687 | //$this->AddElement(new GoogleSitemapGeneratorXmlEntry());
|
---|
| 1688 |
|
---|
| 1689 | //Debug mode?
|
---|
| 1690 | $debug=$this->GetOption("b_debug");
|
---|
| 1691 |
|
---|
| 1692 | if($this->GetOption("b_xml")) {
|
---|
| 1693 | $fileName = $this->GetXmlPath();
|
---|
| 1694 | $status->StartXml($this->GetXmlPath(),$this->GetXmlUrl());
|
---|
| 1695 |
|
---|
| 1696 | if($this->IsFileWritable($fileName)) {
|
---|
| 1697 |
|
---|
| 1698 | $this->_fileHandle = fopen($fileName,"w");
|
---|
| 1699 | if(!$this->_fileHandle) $status->EndXml(false,"Not openable");
|
---|
| 1700 |
|
---|
| 1701 | } else $status->EndXml(false,"not writable");
|
---|
| 1702 | }
|
---|
| 1703 |
|
---|
| 1704 | //Write gzipped sitemap file
|
---|
| 1705 | if($this->IsGzipEnabled()) {
|
---|
| 1706 | $fileName = $this->GetZipPath();
|
---|
| 1707 | $status->StartZip($this->GetZipPath(),$this->GetZipUrl());
|
---|
| 1708 |
|
---|
| 1709 | if($this->IsFileWritable($fileName)) {
|
---|
| 1710 |
|
---|
| 1711 | $this->_fileZipHandle = gzopen($fileName,"w1");
|
---|
| 1712 | if(!$this->_fileZipHandle) $status->EndZip(false,"Not openable");
|
---|
| 1713 |
|
---|
| 1714 | } else $status->EndZip(false,"not writable");
|
---|
| 1715 | }
|
---|
| 1716 |
|
---|
| 1717 | if(!$this->_fileHandle && !$this->_fileZipHandle) {
|
---|
| 1718 | $status->End();
|
---|
| 1719 | return;
|
---|
| 1720 | }
|
---|
| 1721 |
|
---|
| 1722 |
|
---|
| 1723 | //Content of the XML file
|
---|
| 1724 | $this->AddElement(new GoogleSitemapGeneratorXmlEntry('<?xml version="1.0" encoding="UTF-8"' . '?' . '>'));
|
---|
| 1725 |
|
---|
| 1726 | $styleSheet = ($this->GetDefaultStyle() && $this->GetOption('b_style_default')===true?$this->GetDefaultStyle():$this->GetOption('b_style'));
|
---|
| 1727 |
|
---|
| 1728 | if(!empty($styleSheet)) {
|
---|
| 1729 | $this->AddElement(new GoogleSitemapGeneratorXmlEntry('<' . '?xml-stylesheet type="text/xsl" href="' . $styleSheet . '"?' . '>'));
|
---|
| 1730 | }
|
---|
| 1731 |
|
---|
| 1732 | $this->AddElement(new GoogleSitemapGeneratorDebugEntry("generator=\"wordpress/" . get_bloginfo('version') . "\""));
|
---|
| 1733 | $this->AddElement(new GoogleSitemapGeneratorDebugEntry("sitemap-generator-url=\"http://www.arnebrachhold.de\" sitemap-generator-version=\"" . $this->GetVersion() . "\""));
|
---|
| 1734 | $this->AddElement(new GoogleSitemapGeneratorDebugEntry("generated-on=\"" . date(get_option("date_format") . " " . get_option("time_format")) . "\""));
|
---|
| 1735 |
|
---|
| 1736 | //All comments as an asso. Array (postID=>commentCount)
|
---|
| 1737 | $comments=($this->GetOption("b_prio_provider")!=""?$this->GetComments():array());
|
---|
| 1738 |
|
---|
| 1739 | //Full number of comments
|
---|
| 1740 | $commentCount=(count($comments)>0?$this->GetCommentCount($comments):0);
|
---|
| 1741 |
|
---|
| 1742 | if($debug && $this->GetOption("b_prio_provider")!="") {
|
---|
| 1743 | $this->AddElement(new GoogleSitemapGeneratorDebugEntry("Debug: Total comment count: " . $commentCount));
|
---|
| 1744 | }
|
---|
| 1745 |
|
---|
| 1746 | //Go XML!
|
---|
| 1747 | $this->AddElement(new GoogleSitemapGeneratorXmlEntry('<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'));
|
---|
| 1748 |
|
---|
| 1749 | $home = get_bloginfo('url');
|
---|
| 1750 |
|
---|
| 1751 | $homePid = 0;
|
---|
| 1752 |
|
---|
| 1753 | //Add the home page (WITH a slash!)
|
---|
| 1754 | if($this->GetOption("in_home")) {
|
---|
| 1755 | if('page' == get_option('show_on_front') && get_option('page_on_front')) {
|
---|
| 1756 | $pageOnFront = get_option('page_on_front');
|
---|
| 1757 | $p = get_page($pageOnFront);
|
---|
| 1758 | if($p) {
|
---|
| 1759 | $homePid = $p->ID;
|
---|
| 1760 | $this->AddUrl(trailingslashit($home),$this->GetTimestampFromMySql(($p->post_modified_gmt && $p->post_modified_gmt!='0000-00-00 00:00:00'?$p->post_modified_gmt:$p->post_date_gmt)),$this->GetOption("cf_home"),$this->GetOption("pr_home"));
|
---|
| 1761 | }
|
---|
| 1762 | } else {
|
---|
| 1763 | $this->AddUrl(trailingslashit($home),$this->GetTimestampFromMySql(get_lastpostmodified('GMT')),$this->GetOption("cf_home"),$this->GetOption("pr_home"));
|
---|
| 1764 | }
|
---|
| 1765 | }
|
---|
| 1766 |
|
---|
| 1767 | //Add the posts
|
---|
| 1768 | if($this->GetOption("in_posts") || $this->GetOption("in_pages")) {
|
---|
| 1769 |
|
---|
| 1770 | if($debug) $this->AddElement(new GoogleSitemapGeneratorDebugEntry("Debug: Start Postings"));
|
---|
| 1771 |
|
---|
| 1772 | //Pre 2.1 compatibility. 2.1 introduced 'future' as post_status so we don't need to check post_date
|
---|
| 1773 | $wpCompat = (floatval($wp_version) < 2.1);
|
---|
| 1774 |
|
---|
| 1775 | $useQTransLate = false; //function_exists('qtrans_convertURL') && function_exists('qtrans_getEnabledLanguages'); Not really working yet
|
---|
| 1776 |
|
---|
| 1777 | $excludes = $this->GetOption('b_exclude'); //Excluded posts
|
---|
| 1778 |
|
---|
| 1779 | $exclCats = $this->GetOption("b_exclude_cats"); // Excluded cats
|
---|
| 1780 |
|
---|
| 1781 | if($exclCats && count($exclCats)>0 && $this->IsTaxonomySupported()) {
|
---|
| 1782 |
|
---|
| 1783 | $exPosts = get_objects_in_term($exclCats,"category"); // Get all posts in excl. cats
|
---|
| 1784 |
|
---|
| 1785 | if(is_array($exPosts) && count($exPosts) > 0) { //Merge it with the list of user excluded posts
|
---|
| 1786 | $excludes = array_merge($excludes, $exPosts);
|
---|
| 1787 | }
|
---|
| 1788 | }
|
---|
| 1789 |
|
---|
| 1790 |
|
---|
| 1791 | $contentStmt = '';
|
---|
| 1792 | if($useQTransLate) {
|
---|
| 1793 | $contentStmt.=', post_content ';
|
---|
| 1794 | }
|
---|
| 1795 |
|
---|
| 1796 | $postPageStmt = '';
|
---|
| 1797 |
|
---|
| 1798 | $inSubPages = ($this->GetOption('in_posts_sub')===true);
|
---|
| 1799 |
|
---|
| 1800 | if($inSubPages && $this->GetOption('in_posts')===true) {
|
---|
| 1801 | $pageDivider='<!--nextpage-->';
|
---|
| 1802 | $postPageStmt = ", (character_length(`post_content`) - character_length(REPLACE(`post_content`, '$pageDivider', ''))) / " . strlen($pageDivider) . " as postPages";
|
---|
| 1803 | }
|
---|
| 1804 |
|
---|
| 1805 | $sql="SELECT `ID`, `post_author`, `post_date`, `post_date_gmt`, `post_status`, `post_name`, `post_modified`, `post_modified_gmt`, `post_parent`, `post_type` $postPageStmt $contentStmt FROM `" . $wpdb->posts . "` WHERE ";
|
---|
| 1806 |
|
---|
| 1807 | $where = '(';
|
---|
| 1808 |
|
---|
| 1809 | if($this->GetOption('in_posts')) {
|
---|
| 1810 | //WP < 2.1: posts are post_status = publish
|
---|
| 1811 | //WP >= 2.1: post_type must be 'post', no date check required because future posts are post_status='future'
|
---|
| 1812 | if($wpCompat) $where.="(post_status = 'publish' AND post_date_gmt <= '" . gmdate('Y-m-d H:i:59') . "')";
|
---|
| 1813 | else $where.=" (post_status = 'publish' AND (post_type = 'post' OR post_type = '')) ";
|
---|
| 1814 | }
|
---|
| 1815 |
|
---|
| 1816 | if($this->GetOption('in_pages')) {
|
---|
| 1817 | if($this->GetOption('in_posts')) {
|
---|
| 1818 | $where.=" OR ";
|
---|
| 1819 | }
|
---|
| 1820 | if($wpCompat) {
|
---|
| 1821 | //WP < 2.1: posts have post_status = published, pages have post_status = static
|
---|
| 1822 | $where.=" post_status='static' ";
|
---|
| 1823 | } else {
|
---|
| 1824 | //WP >= 2.1: posts have post_type = 'post' and pages have post_type = 'page'. Both must be published.
|
---|
| 1825 | $where.=" (post_status = 'publish' AND post_type = 'page') ";
|
---|
| 1826 | }
|
---|
| 1827 | }
|
---|
| 1828 |
|
---|
| 1829 | $where.=") ";
|
---|
| 1830 |
|
---|
| 1831 |
|
---|
| 1832 | if(is_array($excludes) && count($excludes)>0) {
|
---|
| 1833 | $where.=" AND ID NOT IN ('" . implode("','",$excludes) . "')";
|
---|
| 1834 | }
|
---|
| 1835 |
|
---|
| 1836 | $where.=" AND post_password='' ORDER BY post_modified DESC";
|
---|
| 1837 |
|
---|
| 1838 | $sql .= $where;
|
---|
| 1839 |
|
---|
| 1840 | if($this->GetOption("b_max_posts")>0) {
|
---|
| 1841 | $sql.=" LIMIT 0," . $this->GetOption("b_max_posts");
|
---|
| 1842 | }
|
---|
| 1843 |
|
---|
| 1844 | $postCount = intval($wpdb->get_var("SELECT COUNT(*) AS cnt FROM `" . $wpdb->posts . "` WHERE ". $where,0,0));
|
---|
| 1845 |
|
---|
| 1846 | //Create a new connection because we are using mysql_unbuffered_query and don't want to disturb the WP connection
|
---|
| 1847 | //Safe Mode for other plugins which use mysql_query() without a connection handler and will destroy our resultset :(
|
---|
| 1848 | $con = $postRes = null;
|
---|
| 1849 |
|
---|
| 1850 | //In 2.2, a bug which prevented additional DB connections was fixed
|
---|
| 1851 | if(floatval($wp_version) < 2.2) {
|
---|
| 1852 | $this->SetOption("b_safemode",true);
|
---|
| 1853 | }
|
---|
| 1854 |
|
---|
| 1855 | if($this->GetOption("b_safemode")===true) {
|
---|
| 1856 | $postRes = mysql_query($sql,$wpdb->dbh);
|
---|
| 1857 | if(!$postRes) {
|
---|
| 1858 | trigger_error("MySQL query failed: " . mysql_error(),E_USER_NOTICE); //E_NOTE will be displayed on our debug mode
|
---|
| 1859 | return;
|
---|
| 1860 | }
|
---|
| 1861 | } else {
|
---|
| 1862 | $con = mysql_connect(DB_HOST,DB_USER,DB_PASSWORD,true);
|
---|
| 1863 | if(!$con) {
|
---|
| 1864 | trigger_error("MySQL Connection failed: " . mysql_error(),E_USER_NOTICE);
|
---|
| 1865 | return;
|
---|
| 1866 | }
|
---|
| 1867 | if(!mysql_select_db(DB_NAME,$con)) {
|
---|
| 1868 | trigger_error("MySQL DB Select failed: " . mysql_error(),E_USER_NOTICE);
|
---|
| 1869 | return;
|
---|
| 1870 | }
|
---|
| 1871 | $postRes = mysql_unbuffered_query($sql,$con);
|
---|
| 1872 |
|
---|
| 1873 | if(!$postRes) {
|
---|
| 1874 | trigger_error("MySQL unbuffered query failed: " . mysql_error(),E_USER_NOTICE);
|
---|
| 1875 | return;
|
---|
| 1876 | }
|
---|
| 1877 | }
|
---|
| 1878 |
|
---|
| 1879 | if($postRes) {
|
---|
| 1880 |
|
---|
| 1881 | //#type $prioProvider GoogleSitemapGeneratorPrioProviderBase
|
---|
| 1882 | $prioProvider=NULL;
|
---|
| 1883 |
|
---|
| 1884 | if($this->GetOption("b_prio_provider") != '') {
|
---|
| 1885 | $providerClass=$this->GetOption('b_prio_provider');
|
---|
| 1886 | $prioProvider = new $providerClass($commentCount,$postCount);
|
---|
| 1887 | }
|
---|
| 1888 |
|
---|
| 1889 | //$posts is used by Alex King's Popularity Contest plugin
|
---|
| 1890 | //if($posts == null || !is_array($posts)) {
|
---|
| 1891 | // $posts = &$postRes;
|
---|
| 1892 | //}
|
---|
| 1893 |
|
---|
| 1894 | $z = 1;
|
---|
| 1895 | $zz = 1;
|
---|
| 1896 |
|
---|
| 1897 | //Default priorities
|
---|
| 1898 | $default_prio_posts = $this->GetOption('pr_posts');
|
---|
| 1899 | $default_prio_pages = $this->GetOption('pr_pages');
|
---|
| 1900 |
|
---|
| 1901 | //Change frequencies
|
---|
| 1902 | $cf_pages = $this->GetOption('cf_pages');
|
---|
| 1903 | $cf_posts = $this->GetOption('cf_posts');
|
---|
| 1904 |
|
---|
| 1905 | $minPrio=$this->GetOption('pr_posts_min');
|
---|
| 1906 |
|
---|
| 1907 |
|
---|
| 1908 | //Cycle through all posts and add them
|
---|
| 1909 | while($post = mysql_fetch_object($postRes)) {
|
---|
| 1910 |
|
---|
| 1911 | //Fill the cache with our DB result. Since it's incomplete (no text-content for example), we will clean it later.
|
---|
| 1912 | $cache = array(&$post);
|
---|
| 1913 | update_post_cache($cache);
|
---|
| 1914 |
|
---|
| 1915 | //Set the current working post for other plugins which depend on "the loop"
|
---|
| 1916 | $GLOBALS['post'] = &$post;
|
---|
| 1917 |
|
---|
| 1918 | $permalink = get_permalink($post->ID);
|
---|
| 1919 | if($permalink != $home && $post->ID != $homePid) {
|
---|
| 1920 |
|
---|
| 1921 | $isPage = false;
|
---|
| 1922 | if($wpCompat) {
|
---|
| 1923 | $isPage = ($post->post_status == 'static');
|
---|
| 1924 | } else {
|
---|
| 1925 | $isPage = ($post->post_type == 'page');
|
---|
| 1926 | }
|
---|
| 1927 |
|
---|
| 1928 |
|
---|
| 1929 | //Default Priority if auto calc is disabled
|
---|
| 1930 | $prio = 0;
|
---|
| 1931 |
|
---|
| 1932 | if($isPage) {
|
---|
| 1933 | //Priority for static pages
|
---|
| 1934 | $prio = $default_prio_pages;
|
---|
| 1935 | } else {
|
---|
| 1936 | //Priority for normal posts
|
---|
| 1937 | $prio = $default_prio_posts;
|
---|
| 1938 | }
|
---|
| 1939 |
|
---|
| 1940 | //If priority calc. is enabled, calculate (but only for posts, not pages)!
|
---|
| 1941 | if($prioProvider !== null && !$isPage) {
|
---|
| 1942 |
|
---|
| 1943 | //Comment count for this post
|
---|
| 1944 | $cmtcnt = (isset($comments[$post->ID])?$comments[$post->ID]:0);
|
---|
| 1945 | $prio = $prioProvider->GetPostPriority($post->ID, $cmtcnt, $post);
|
---|
| 1946 |
|
---|
| 1947 | if($debug) $this->AddElement(new GoogleSitemapGeneratorDebugEntry('Debug: Priority report of postID ' . $post->ID . ': Comments: ' . $cmtcnt . ' of ' . $commentCount . ' = ' . $prio . ' points'));
|
---|
| 1948 | }
|
---|
| 1949 |
|
---|
| 1950 | if(!$isPage && $minPrio>0 && $prio<$minPrio) {
|
---|
| 1951 | $prio = $minPrio;
|
---|
| 1952 | }
|
---|
| 1953 |
|
---|
| 1954 | //Add it
|
---|
| 1955 | $this->AddUrl($permalink,$this->GetTimestampFromMySql(($post->post_modified_gmt && $post->post_modified_gmt!='0000-00-00 00:00:00'?$post->post_modified_gmt:$post->post_date_gmt)),($isPage?$cf_pages:$cf_posts),$prio);
|
---|
| 1956 |
|
---|
| 1957 | if($inSubPages) {
|
---|
| 1958 | $subPage = '';
|
---|
| 1959 | for($p = 1; $p <= $post->postPages; $p++) {
|
---|
| 1960 | if(get_option('permalink_structure') == '') {
|
---|
| 1961 | $subPage = $permalink . '&page=' . ($p+1);
|
---|
| 1962 | } else {
|
---|
| 1963 | $subPage = trailingslashit($permalink) . user_trailingslashit($p+1, 'single_paged');
|
---|
| 1964 | }
|
---|
| 1965 |
|
---|
| 1966 | $this->AddUrl($subPage,$this->GetTimestampFromMySql(($post->post_modified_gmt && $post->post_modified_gmt!='0000-00-00 00:00:00'?$post->post_modified_gmt:$post->post_date_gmt)),($isPage?$cf_pages:$cf_posts),$prio);
|
---|
| 1967 | }
|
---|
| 1968 | }
|
---|
| 1969 |
|
---|
| 1970 | // Multilingual Support with qTranslate, thanks to Qian Qin
|
---|
| 1971 | if($useQTransLate) {
|
---|
| 1972 | global $q_config;
|
---|
| 1973 | foreach(qtrans_getEnabledLanguages($post->post_content) as $language) {
|
---|
| 1974 | if($language!=$q_config['default_language']) {
|
---|
| 1975 | $this->AddUrl(qtrans_convertURL($permalink,$language),$this->GetTimestampFromMySql(($post->post_modified_gmt && $post->post_modified_gmt!='0000-00-00 00:00:00'?$post->post_modified_gmt:$post->post_date_gmt)),($isPage?$cf_pages:$cf_posts),$prio);
|
---|
| 1976 | }
|
---|
| 1977 | }
|
---|
| 1978 | }
|
---|
| 1979 | }
|
---|
| 1980 |
|
---|
| 1981 | //Update the status every 100 posts and at the end.
|
---|
| 1982 | //If the script breaks because of memory or time limit,
|
---|
| 1983 | //we have a "last reponded" value which can be compared to the server settings
|
---|
| 1984 | if($zz==100 || $z == $postCount) {
|
---|
| 1985 | $status->SaveStep($z);
|
---|
| 1986 | $zz=0;
|
---|
| 1987 | } else $zz++;
|
---|
| 1988 |
|
---|
| 1989 | $z++;
|
---|
| 1990 |
|
---|
| 1991 | //Clean cache because it's incomplete
|
---|
| 1992 | if(version_compare($wp_version,"2.5",">=")) {
|
---|
| 1993 | //WP 2.5 makes a mysql query for every clean_post_cache to clear the child cache
|
---|
| 1994 | //so I've copied the function here until a patch arrives...
|
---|
| 1995 | wp_cache_delete($post->ID, 'posts');
|
---|
| 1996 | wp_cache_delete($post->ID, 'post_meta');
|
---|
| 1997 | clean_object_term_cache($post->ID, 'post');
|
---|
| 1998 | } else {
|
---|
| 1999 | clean_post_cache($post->ID);
|
---|
| 2000 | }
|
---|
| 2001 | }
|
---|
| 2002 | unset($postRes);
|
---|
| 2003 | unset($prioProvider);
|
---|
| 2004 |
|
---|
| 2005 | if($this->GetOption("b_safemode")!==true && $con) mysql_close($con);
|
---|
| 2006 | }
|
---|
| 2007 | if($debug) $this->AddElement(new GoogleSitemapGeneratorDebugEntry("Debug: End Postings"));
|
---|
| 2008 | }
|
---|
| 2009 |
|
---|
| 2010 | //Add the cats
|
---|
| 2011 | if($this->GetOption("in_cats")) {
|
---|
| 2012 | if($debug) $this->AddElement(new GoogleSitemapGeneratorDebugEntry("Debug: Start Cats"));
|
---|
| 2013 |
|
---|
| 2014 | $exclCats = $this->GetOption("b_exclude_cats"); // Excluded cats
|
---|
| 2015 | if($exclCats == null) $exclCats=array();
|
---|
| 2016 |
|
---|
| 2017 | if(!$this->IsTaxonomySupported()) {
|
---|
| 2018 |
|
---|
| 2019 | $catsRes=$wpdb->get_results("
|
---|
| 2020 | SELECT
|
---|
| 2021 | c.cat_ID AS ID,
|
---|
| 2022 | MAX(p.post_modified_gmt) AS last_mod
|
---|
| 2023 | FROM
|
---|
| 2024 | `" . $wpdb->categories . "` c,
|
---|
| 2025 | `" . $wpdb->post2cat . "` pc,
|
---|
| 2026 | `" . $wpdb->posts . "` p
|
---|
| 2027 | WHERE
|
---|
| 2028 | pc.category_id = c.cat_ID
|
---|
| 2029 | AND p.ID = pc.post_id
|
---|
| 2030 | AND p.post_status = 'publish'
|
---|
| 2031 | AND p.post_type='post'
|
---|
| 2032 | GROUP
|
---|
| 2033 | BY c.cat_id
|
---|
| 2034 | ");
|
---|
| 2035 | if($catsRes) {
|
---|
| 2036 | foreach($catsRes as $cat) {
|
---|
| 2037 | if($cat && $cat->ID && $cat->ID>0 && !in_array($cat->ID, $exclCats)) {
|
---|
| 2038 | if($debug) if($debug) $this->AddElement(new GoogleSitemapGeneratorDebugEntry("Cat-ID:" . $cat->ID));
|
---|
| 2039 | $this->AddUrl(get_category_link($cat->ID),$this->GetTimestampFromMySql($cat->last_mod),$this->GetOption("cf_cats"),$this->GetOption("pr_cats"));
|
---|
| 2040 | }
|
---|
| 2041 | }
|
---|
| 2042 | }
|
---|
| 2043 | } else {
|
---|
| 2044 | $cats = get_terms("category",array("hide_empty"=>true,"hierarchical"=>false));
|
---|
| 2045 | if($cats && is_array($cats) && count($cats)>0) {
|
---|
| 2046 | foreach($cats AS $cat) {
|
---|
| 2047 | if(!in_array($cat->term_id, $exclCats)) $this->AddUrl(get_category_link($cat->term_id),0,$this->GetOption("cf_cats"),$this->GetOption("pr_cats"));
|
---|
| 2048 | }
|
---|
| 2049 | }
|
---|
| 2050 | }
|
---|
| 2051 | if($debug) $this->AddElement(new GoogleSitemapGeneratorDebugEntry("Debug: End Cats"));
|
---|
| 2052 | }
|
---|
| 2053 |
|
---|
| 2054 | //Add the archives
|
---|
| 2055 | if($this->GetOption("in_arch")) {
|
---|
| 2056 | if($debug) $this->AddElement(new GoogleSitemapGeneratorDebugEntry("Debug: Start Archive"));
|
---|
| 2057 | $now = current_time('mysql');
|
---|
| 2058 |
|
---|
| 2059 | //WP2.1 introduced post_status='future', for earlier WP versions we need to check the post_date_gmt
|
---|
| 2060 | $arcresults = $wpdb->get_results("
|
---|
| 2061 | SELECT DISTINCT
|
---|
| 2062 | YEAR(post_date_gmt) AS `year`,
|
---|
| 2063 | MONTH(post_date_gmt) AS `month`,
|
---|
| 2064 | MAX(post_date_gmt) as last_mod,
|
---|
| 2065 | count(ID) as posts
|
---|
| 2066 | FROM
|
---|
| 2067 | $wpdb->posts
|
---|
| 2068 | WHERE
|
---|
| 2069 | post_date < '$now'
|
---|
| 2070 | AND post_status = 'publish'
|
---|
| 2071 | AND post_type = 'post'
|
---|
| 2072 | " . (floatval($wp_version) < 2.1?"AND {$wpdb->posts}.post_date_gmt <= '" . gmdate('Y-m-d H:i:59') . "'":"") . "
|
---|
| 2073 | GROUP BY
|
---|
| 2074 | YEAR(post_date_gmt),
|
---|
| 2075 | MONTH(post_date_gmt)
|
---|
| 2076 | ORDER BY
|
---|
| 2077 | post_date_gmt DESC");
|
---|
| 2078 | if ($arcresults) {
|
---|
| 2079 | foreach ($arcresults as $arcresult) {
|
---|
| 2080 |
|
---|
| 2081 | $url = get_month_link($arcresult->year, $arcresult->month);
|
---|
| 2082 | $changeFreq="";
|
---|
| 2083 |
|
---|
| 2084 | //Archive is the current one
|
---|
| 2085 | if($arcresult->month==date("n") && $arcresult->year==date("Y")) {
|
---|
| 2086 | $changeFreq=$this->GetOption("cf_arch_curr");
|
---|
| 2087 | } else { // Archive is older
|
---|
| 2088 | $changeFreq=$this->GetOption("cf_arch_old");
|
---|
| 2089 | }
|
---|
| 2090 |
|
---|
| 2091 | $this->AddUrl($url,$this->GetTimestampFromMySql($arcresult->last_mod),$changeFreq,$this->GetOption("pr_arch"));
|
---|
| 2092 | }
|
---|
| 2093 | }
|
---|
| 2094 | if($debug) $this->AddElement(new GoogleSitemapGeneratorDebugEntry("Debug: End Archive"));
|
---|
| 2095 | }
|
---|
| 2096 |
|
---|
| 2097 | //Add the author pages
|
---|
| 2098 | if($this->GetOption("in_auth")) {
|
---|
| 2099 | if($debug) $this->AddElement(new GoogleSitemapGeneratorDebugEntry("Debug: Start Author pages"));
|
---|
| 2100 |
|
---|
| 2101 | $linkFunc = null;
|
---|
| 2102 |
|
---|
| 2103 | //get_author_link is deprecated in WP 2.1, try to use get_author_posts_url first.
|
---|
| 2104 | if(function_exists('get_author_posts_url')) {
|
---|
| 2105 | $linkFunc = 'get_author_posts_url';
|
---|
| 2106 | } else if(function_exists('get_author_link')) {
|
---|
| 2107 | $linkFunc = 'get_author_link';
|
---|
| 2108 | }
|
---|
| 2109 |
|
---|
| 2110 | //Who knows what happens in later WP versions, so check again if it worked
|
---|
| 2111 | if($linkFunc !== null) {
|
---|
| 2112 | //Unfortunately there is no API function to get all authors, so we have to do it the dirty way...
|
---|
| 2113 | //We retrieve only users with published and not password protected posts (and not pages)
|
---|
| 2114 | //WP2.1 introduced post_status='future', for earlier WP versions we need to check the post_date_gmt
|
---|
| 2115 | $sql = "SELECT DISTINCT
|
---|
| 2116 | {$wpdb->users}.ID,
|
---|
| 2117 | {$wpdb->users}.user_nicename,
|
---|
| 2118 | MAX({$wpdb->posts}.post_modified_gmt) AS last_post
|
---|
| 2119 | FROM
|
---|
| 2120 | {$wpdb->users},
|
---|
| 2121 | {$wpdb->posts}
|
---|
| 2122 | WHERE
|
---|
| 2123 | {$wpdb->posts}.post_author = {$wpdb->users}.ID
|
---|
| 2124 | AND {$wpdb->posts}.post_status = 'publish'
|
---|
| 2125 | AND {$wpdb->posts}.post_type = 'post'
|
---|
| 2126 | AND {$wpdb->posts}.post_password = ''
|
---|
| 2127 | " . (floatval($wp_version) < 2.1?"AND {$wpdb->posts}.post_date_gmt <= '" . gmdate('Y-m-d H:i:59') . "'":"") . "
|
---|
| 2128 | GROUP BY
|
---|
| 2129 | {$wpdb->users}.ID,
|
---|
| 2130 | {$wpdb->users}.user_nicename";
|
---|
| 2131 |
|
---|
| 2132 | $authors = $wpdb->get_results($sql);
|
---|
| 2133 |
|
---|
| 2134 | if($authors && is_array($authors)) {
|
---|
| 2135 | foreach($authors as $author) {
|
---|
| 2136 | if($debug) if($debug) $this->AddElement(new GoogleSitemapGeneratorDebugEntry("Author-ID:" . $author->ID));
|
---|
| 2137 | $url = ($linkFunc=='get_author_posts_url'?get_author_posts_url($author->ID,$author->user_nicename):get_author_link(false,$author->ID,$author->user_nicename));
|
---|
| 2138 | $this->AddUrl($url,$this->GetTimestampFromMySql($author->last_post),$this->GetOption("cf_auth"),$this->GetOption("pr_auth"));
|
---|
| 2139 | }
|
---|
| 2140 | }
|
---|
| 2141 | } else {
|
---|
| 2142 | //Too bad, no author pages for you :(
|
---|
| 2143 | if($debug) $this->AddElement(new GoogleSitemapGeneratorDebugEntry("Debug: No valid author link function found"));
|
---|
| 2144 | }
|
---|
| 2145 |
|
---|
| 2146 | if($debug) $this->AddElement(new GoogleSitemapGeneratorDebugEntry("Debug: End Author pages"));
|
---|
| 2147 | }
|
---|
| 2148 |
|
---|
| 2149 | //Add tag pages
|
---|
| 2150 | if($this->GetOption("in_tags") && $this->IsTaxonomySupported()) {
|
---|
| 2151 | if($debug) $this->AddElement(new GoogleSitemapGeneratorDebugEntry("Debug: Start Tags"));
|
---|
| 2152 | $tags = get_terms("post_tag",array("hide_empty"=>true,"hierarchical"=>false));
|
---|
| 2153 | if($tags && is_array($tags) && count($tags)>0) {
|
---|
| 2154 | foreach($tags AS $tag) {
|
---|
| 2155 | $this->AddUrl(get_tag_link($tag->term_id),0,$this->GetOption("cf_tags"),$this->GetOption("pr_tags"));
|
---|
| 2156 | }
|
---|
| 2157 | }
|
---|
| 2158 | if($debug) $this->AddElement(new GoogleSitemapGeneratorDebugEntry("Debug: End Tags"));
|
---|
| 2159 | }
|
---|
| 2160 |
|
---|
| 2161 | //Add the custom pages
|
---|
| 2162 | if($debug) $this->AddElement(new GoogleSitemapGeneratorDebugEntry("Debug: Start Custom Pages"));
|
---|
| 2163 | if($this->_pages && is_array($this->_pages) && count($this->_pages)>0) {
|
---|
| 2164 | //#type $page GoogleSitemapGeneratorPage
|
---|
| 2165 | foreach($this->_pages AS $page) {
|
---|
| 2166 | $this->AddUrl($page->GetUrl(),$page->getLastMod(),$page->getChangeFreq(),$page->getPriority());
|
---|
| 2167 | }
|
---|
| 2168 | }
|
---|
| 2169 |
|
---|
| 2170 | if($debug) $this->AddElement(new GoogleSitemapGeneratorDebugEntry("Debug: End Custom Pages"));
|
---|
| 2171 |
|
---|
| 2172 | if($debug) $this->AddElement(new GoogleSitemapGeneratorDebugEntry("Debug: Start additional URLs"));
|
---|
| 2173 |
|
---|
| 2174 | do_action("sm_buildmap");
|
---|
| 2175 |
|
---|
| 2176 | if($debug) $this->AddElement(new GoogleSitemapGeneratorDebugEntry("Debug: End additional URLs"));
|
---|
| 2177 |
|
---|
| 2178 | $this->AddElement(new GoogleSitemapGeneratorXmlEntry("</urlset>"));
|
---|
| 2179 |
|
---|
| 2180 |
|
---|
| 2181 | $pingUrl='';
|
---|
| 2182 |
|
---|
| 2183 | if($this->GetOption("b_xml")) {
|
---|
| 2184 | if($this->_fileHandle && fclose($this->_fileHandle)) {
|
---|
| 2185 | $this->_fileHandle = null;
|
---|
| 2186 | $status->EndXml(true);
|
---|
| 2187 | $pingUrl=$this->GetXmlUrl();
|
---|
| 2188 | } else $status->EndXml(false,"Could not close the sitemap file.");
|
---|
| 2189 | }
|
---|
| 2190 |
|
---|
| 2191 | if($this->IsGzipEnabled()) {
|
---|
| 2192 | if($this->_fileZipHandle && fclose($this->_fileZipHandle)) {
|
---|
| 2193 | $this->_fileZipHandle = null;
|
---|
| 2194 | $status->EndZip(true);
|
---|
| 2195 | $pingUrl=$this->GetZipUrl();
|
---|
| 2196 | } else $status->EndZip(false,"Could not close the zipped sitemap file");
|
---|
| 2197 | }
|
---|
| 2198 |
|
---|
| 2199 | //Ping Google
|
---|
| 2200 | if($this->GetOption("b_ping") && !empty($pingUrl)) {
|
---|
| 2201 | $sPingUrl="http://www.google.com/webmasters/sitemaps/ping?sitemap=" . urlencode($pingUrl);
|
---|
| 2202 | $status->StartGooglePing($sPingUrl);
|
---|
| 2203 | $pingres=$this->RemoteOpen($sPingUrl);
|
---|
| 2204 |
|
---|
| 2205 | if($pingres==NULL || $pingres===false) {
|
---|
| 2206 | $status->EndGooglePing(false,$this->_lastError);
|
---|
| 2207 | trigger_error("Failed to ping Google: " . htmlspecialchars(strip_tags($pingres)),E_USER_NOTICE);
|
---|
| 2208 | } else {
|
---|
| 2209 | $status->EndGooglePing(true);
|
---|
| 2210 | }
|
---|
| 2211 | }
|
---|
| 2212 |
|
---|
| 2213 | //Ping Ask.com
|
---|
| 2214 | if($this->GetOption("b_pingask") && !empty($pingUrl)) {
|
---|
| 2215 | $sPingUrl="http://submissions.ask.com/ping?sitemap=" . urlencode($pingUrl);
|
---|
| 2216 | $status->StartAskPing($sPingUrl);
|
---|
| 2217 | $pingres=$this->RemoteOpen($sPingUrl);
|
---|
| 2218 |
|
---|
| 2219 | if($pingres==NULL || $pingres===false || strpos($pingres,"successfully received and added")===false) { //Ask.com returns 200 OK even if there was an error, so we need to check the content.
|
---|
| 2220 | $status->EndAskPing(false,$this->_lastError);
|
---|
| 2221 | trigger_error("Failed to ping Ask.com: " . htmlspecialchars(strip_tags($pingres)),E_USER_NOTICE);
|
---|
| 2222 | } else {
|
---|
| 2223 | $status->EndAskPing(true);
|
---|
| 2224 | }
|
---|
| 2225 | }
|
---|
| 2226 |
|
---|
| 2227 | //Ping YAHOO
|
---|
| 2228 | if($this->GetOption("b_pingyahoo")===true && $this->GetOption("b_yahookey")!="" && !empty($pingUrl)) {
|
---|
| 2229 | $sPingUrl="http://search.yahooapis.com/SiteExplorerService/V1/updateNotification?appid=" . $this->GetOption("b_yahookey") . "&url=" . urlencode($pingUrl);
|
---|
| 2230 | $status->StartYahooPing($sPingUrl);
|
---|
| 2231 | $pingres=$this->RemoteOpen($sPingUrl);
|
---|
| 2232 |
|
---|
| 2233 | if($pingres==NULL || $pingres===false || strpos(strtolower($pingres),"success")===false) {
|
---|
| 2234 | trigger_error("Failed to ping YAHOO: " . htmlspecialchars(strip_tags($pingres)),E_USER_NOTICE);
|
---|
| 2235 | $status->EndYahooPing(false,$this->_lastError);
|
---|
| 2236 | } else {
|
---|
| 2237 | $status->EndYahooPing(true);
|
---|
| 2238 | }
|
---|
| 2239 | }
|
---|
| 2240 |
|
---|
| 2241 | //Ping Bing
|
---|
| 2242 | if($this->GetOption("b_pingmsn") && !empty($pingUrl)) {
|
---|
| 2243 | $sPingUrl="http://www.bing.com/webmaster/ping.aspx?siteMap=" . urlencode($pingUrl);
|
---|
| 2244 | $status->StartMsnPing($sPingUrl);
|
---|
| 2245 | $pingres=$this->RemoteOpen($sPingUrl);
|
---|
| 2246 |
|
---|
| 2247 | if($pingres==NULL || $pingres===false || strpos($pingres,"Thanks for submitting your sitemap")===false) {
|
---|
| 2248 | trigger_error("Failed to ping Bing: " . htmlspecialchars(strip_tags($pingres)),E_USER_NOTICE);
|
---|
| 2249 | $status->EndMsnPing(false,$this->_lastError);
|
---|
| 2250 | } else {
|
---|
| 2251 | $status->EndMsnPing(true);
|
---|
| 2252 | }
|
---|
| 2253 | }
|
---|
| 2254 |
|
---|
| 2255 | $status->End();
|
---|
| 2256 |
|
---|
| 2257 |
|
---|
| 2258 | $this->_isActive = false;
|
---|
| 2259 |
|
---|
| 2260 | //done...
|
---|
| 2261 | return $status;
|
---|
| 2262 | }
|
---|
| 2263 |
|
---|
| 2264 | function RemoteOpen($url,$method = 'get', $postData = null, $timeout = 10) {
|
---|
| 2265 | global $wp_version;
|
---|
| 2266 |
|
---|
| 2267 | //Before WP 2.7, wp_remote_fopen was quite crappy so Snoopy was favoured.
|
---|
| 2268 | if(floatval($wp_version) < 2.7) {
|
---|
| 2269 | if(!file_exists(ABSPATH . 'wp-includes/class-snoopy.php')) {
|
---|
| 2270 | trigger_error('Snoopy Web Request failed: Snoopy not found.',E_USER_NOTICE);
|
---|
| 2271 | return false; //Hoah?
|
---|
| 2272 | }
|
---|
| 2273 |
|
---|
| 2274 | require_once( ABSPATH . 'wp-includes/class-snoopy.php');
|
---|
| 2275 |
|
---|
| 2276 | $s = new Snoopy();
|
---|
| 2277 |
|
---|
| 2278 | $s->read_timeout = $timeout;
|
---|
| 2279 |
|
---|
| 2280 | if($method == 'get') {
|
---|
| 2281 | $s->fetch($url);
|
---|
| 2282 | } else {
|
---|
| 2283 | $s->submit($url,$postData);
|
---|
| 2284 | }
|
---|
| 2285 |
|
---|
| 2286 | if($s->status != "200") trigger_error('Snoopy Web Request failed: Status: ' . $s->status . "; Content: " . htmlspecialchars($s->results),E_USER_NOTICE);
|
---|
| 2287 |
|
---|
| 2288 | return $s->results;
|
---|
| 2289 |
|
---|
| 2290 | } else {
|
---|
| 2291 |
|
---|
| 2292 | $options = array();
|
---|
| 2293 | $options['timeout'] = $timeout;
|
---|
| 2294 |
|
---|
| 2295 | if($method == 'get') {
|
---|
| 2296 | $response = wp_remote_get( $url, $options );
|
---|
| 2297 | } else {
|
---|
| 2298 | $response = wp_remote_post($url, array_merge($options,array('body'=>$postData)));
|
---|
| 2299 | }
|
---|
| 2300 |
|
---|
| 2301 | if ( is_wp_error( $response ) ) {
|
---|
| 2302 | $errs = $response->get_error_messages();
|
---|
| 2303 | $errs = htmlspecialchars(implode('; ', $errs));
|
---|
| 2304 | trigger_error('WP HTTP API Web Request failed: ' . $errs,E_USER_NOTICE);
|
---|
| 2305 | return false;
|
---|
| 2306 | }
|
---|
| 2307 |
|
---|
| 2308 | return $response['body'];
|
---|
| 2309 | }
|
---|
| 2310 |
|
---|
| 2311 | return false;
|
---|
| 2312 | }
|
---|
| 2313 |
|
---|
| 2314 | /**
|
---|
| 2315 | * Tracks the last error (gets called by PHP)
|
---|
| 2316 | *
|
---|
| 2317 | * @since 3.0
|
---|
| 2318 | * @access private
|
---|
| 2319 | * @author Arne Brachhold
|
---|
| 2320 | */
|
---|
| 2321 | function TrackError($log_level, $log_text, $error_file, $error_line) {
|
---|
| 2322 | $this->_lastError = $log_text;
|
---|
| 2323 | }
|
---|
| 2324 |
|
---|
| 2325 | /**
|
---|
| 2326 | * Echos option fields for an select field containing the valid change frequencies
|
---|
| 2327 | *
|
---|
| 2328 | * @since 3.0
|
---|
| 2329 | * @access private
|
---|
| 2330 | * @author Arne Brachhold
|
---|
| 2331 | * @param $currentVal The value which should be selected
|
---|
| 2332 | * @return all valid change frequencies as html option fields
|
---|
| 2333 | */
|
---|
| 2334 | function HtmlGetFreqNames($currentVal) {
|
---|
| 2335 |
|
---|
| 2336 | foreach($this->_freqNames AS $k=>$v) {
|
---|
| 2337 | echo "<option value=\"$k\" " . $this->HtmlGetSelected($k,$currentVal) .">" . $v . "</option>";
|
---|
| 2338 | }
|
---|
| 2339 | }
|
---|
| 2340 |
|
---|
| 2341 | /**
|
---|
| 2342 | * Echos option fields for an select field containing the valid priorities (0- 1.0)
|
---|
| 2343 | *
|
---|
| 2344 | * @since 3.0
|
---|
| 2345 | * @access private
|
---|
| 2346 | * @author Arne Brachhold
|
---|
| 2347 | * @param $currentVal string The value which should be selected
|
---|
| 2348 | * @return 0.0 - 1.0 as html option fields
|
---|
| 2349 | */
|
---|
| 2350 | function HtmlGetPriorityValues($currentVal) {
|
---|
| 2351 | $currentVal=(float) $currentVal;
|
---|
| 2352 | for($i=0.0; $i<=1.0; $i+=0.1) {
|
---|
| 2353 | $v = number_format($i,1,".","");
|
---|
| 2354 | $t = number_format_i18n($i,1);
|
---|
| 2355 | echo "<option value=\"" . $v . "\" " . $this->HtmlGetSelected("$i","$currentVal") .">";
|
---|
| 2356 | echo $t;
|
---|
| 2357 | echo "</option>";
|
---|
| 2358 | }
|
---|
| 2359 | }
|
---|
| 2360 |
|
---|
| 2361 | /**
|
---|
| 2362 | * Returns the checked attribute if the given values match
|
---|
| 2363 | *
|
---|
| 2364 | * @since 3.0
|
---|
| 2365 | * @access private
|
---|
| 2366 | * @author Arne Brachhold
|
---|
| 2367 | * @param $val string The current value
|
---|
| 2368 | * @param $equals string The value to match
|
---|
| 2369 | * @return The checked attribute if the given values match, an empty string if not
|
---|
| 2370 | */
|
---|
| 2371 | function HtmlGetChecked($val,$equals) {
|
---|
| 2372 | if($val==$equals) return $this->HtmlGetAttribute("checked");
|
---|
| 2373 | else return "";
|
---|
| 2374 | }
|
---|
| 2375 |
|
---|
| 2376 | /**
|
---|
| 2377 | * Returns the selected attribute if the given values match
|
---|
| 2378 | *
|
---|
| 2379 | * @since 3.0
|
---|
| 2380 | * @access private
|
---|
| 2381 | * @author Arne Brachhold
|
---|
| 2382 | * @param $val string The current value
|
---|
| 2383 | * @param $equals string The value to match
|
---|
| 2384 | * @return The selected attribute if the given values match, an empty string if not
|
---|
| 2385 | */
|
---|
| 2386 | function HtmlGetSelected($val,$equals) {
|
---|
| 2387 | if($val==$equals) return $this->HtmlGetAttribute("selected");
|
---|
| 2388 | else return "";
|
---|
| 2389 | }
|
---|
| 2390 |
|
---|
| 2391 | /**
|
---|
| 2392 | * Returns an formatted attribute. If the value is NULL, the name will be used.
|
---|
| 2393 | *
|
---|
| 2394 | * @since 3.0
|
---|
| 2395 | * @access private
|
---|
| 2396 | * @author Arne Brachhold
|
---|
| 2397 | * @param $attr string The attribute name
|
---|
| 2398 | * @param $value string The attribute value
|
---|
| 2399 | * @return The formatted attribute
|
---|
| 2400 | */
|
---|
| 2401 | function HtmlGetAttribute($attr,$value=NULL) {
|
---|
| 2402 | if($value==NULL) $value=$attr;
|
---|
| 2403 | return " " . $attr . "=\"" . $value . "\" ";
|
---|
| 2404 | }
|
---|
| 2405 |
|
---|
| 2406 | /**
|
---|
| 2407 | * Returns an array with GoogleSitemapGeneratorPage objects which is generated from POST values
|
---|
| 2408 | *
|
---|
| 2409 | * @since 3.0
|
---|
| 2410 | * @see GoogleSitemapGeneratorPage
|
---|
| 2411 | * @access private
|
---|
| 2412 | * @author Arne Brachhold
|
---|
| 2413 | * @return array An array with GoogleSitemapGeneratorPage objects
|
---|
| 2414 | */
|
---|
| 2415 | function HtmlApplyPages() {
|
---|
| 2416 | // Array with all page URLs
|
---|
| 2417 | $pages_ur=(!isset($_POST["sm_pages_ur"]) || !is_array($_POST["sm_pages_ur"])?array():$_POST["sm_pages_ur"]);
|
---|
| 2418 |
|
---|
| 2419 | //Array with all priorities
|
---|
| 2420 | $pages_pr=(!isset($_POST["sm_pages_pr"]) || !is_array($_POST["sm_pages_pr"])?array():$_POST["sm_pages_pr"]);
|
---|
| 2421 |
|
---|
| 2422 | //Array with all change frequencies
|
---|
| 2423 | $pages_cf=(!isset($_POST["sm_pages_cf"]) || !is_array($_POST["sm_pages_cf"])?array():$_POST["sm_pages_cf"]);
|
---|
| 2424 |
|
---|
| 2425 | //Array with all lastmods
|
---|
| 2426 | $pages_lm=(!isset($_POST["sm_pages_lm"]) || !is_array($_POST["sm_pages_lm"])?array():$_POST["sm_pages_lm"]);
|
---|
| 2427 |
|
---|
| 2428 | //Array where the new pages are stored
|
---|
| 2429 | $pages=array();
|
---|
| 2430 | //Loop through all defined pages and set their properties into an object
|
---|
| 2431 | if(isset($_POST["sm_pages_mark"]) && is_array($_POST["sm_pages_mark"])) {
|
---|
| 2432 | for($i=0; $i<count($_POST["sm_pages_mark"]); $i++) {
|
---|
| 2433 | //Create new object
|
---|
| 2434 | $p=new GoogleSitemapGeneratorPage();
|
---|
| 2435 | if(substr($pages_ur[$i],0,4)=="www.") $pages_ur[$i]="http://" . $pages_ur[$i];
|
---|
| 2436 | $p->SetUrl($pages_ur[$i]);
|
---|
| 2437 | $p->SetProprity($pages_pr[$i]);
|
---|
| 2438 | $p->SetChangeFreq($pages_cf[$i]);
|
---|
| 2439 | //Try to parse last modified, if -1 (note ===) automatic will be used (0)
|
---|
| 2440 | $lm=(!empty($pages_lm[$i])?strtotime($pages_lm[$i],time()):-1);
|
---|
| 2441 | if($lm===-1) $p->setLastMod(0);
|
---|
| 2442 | else $p->setLastMod($lm);
|
---|
| 2443 | //Add it to the array
|
---|
| 2444 | array_push($pages,$p);
|
---|
| 2445 | }
|
---|
| 2446 | }
|
---|
| 2447 |
|
---|
| 2448 | return $pages;
|
---|
| 2449 | }
|
---|
| 2450 |
|
---|
| 2451 | function GetTimestampFromMySql($mysqlDateTime) {
|
---|
| 2452 | list($date, $hours) = split(' ', $mysqlDateTime);
|
---|
| 2453 | list($year,$month,$day) = split('-',$date);
|
---|
| 2454 | list($hour,$min,$sec) = split(':',$hours);
|
---|
| 2455 | return mktime(intval($hour), intval($min), intval($sec), intval($month), intval($day), intval($year));
|
---|
| 2456 | }
|
---|
| 2457 |
|
---|
| 2458 | function GetRedirectLink($redir) {
|
---|
| 2459 | return trailingslashit("http://www.arnebrachhold.de/redir/" . $redir);
|
---|
| 2460 | }
|
---|
| 2461 |
|
---|
| 2462 | function GetBackLink() {
|
---|
| 2463 | $page = basename(__FILE__);
|
---|
| 2464 | if(isset($_GET['page']) && !empty($_GET['page'])) {
|
---|
| 2465 | $page = preg_replace('[^a-zA-Z0-9\.\_\-]','',$_GET['page']);
|
---|
| 2466 | }
|
---|
| 2467 |
|
---|
| 2468 | if(function_exists("admin_url")) return admin_url(basename($_SERVER["PHP_SELF"])) . "?page=" . $page;
|
---|
| 2469 | else return $_SERVER['PHP_SELF'] . "?page=" . $page;
|
---|
| 2470 | }
|
---|
| 2471 |
|
---|
| 2472 | function HtmlShowOptionsPage() {
|
---|
| 2473 |
|
---|
| 2474 | $ui = $this->GetUI();
|
---|
| 2475 | if($ui) {
|
---|
| 2476 | $ui->HtmlShowOptionsPage();
|
---|
| 2477 | return true;
|
---|
| 2478 | }
|
---|
| 2479 |
|
---|
| 2480 | return false;
|
---|
| 2481 | }
|
---|
| 2482 |
|
---|
| 2483 | var $_ui = null;
|
---|
| 2484 |
|
---|
| 2485 | function GetUI() {
|
---|
| 2486 |
|
---|
| 2487 | global $wp_version;
|
---|
| 2488 |
|
---|
| 2489 | if($this->_ui === null) {
|
---|
| 2490 |
|
---|
| 2491 | $className='GoogleSitemapGeneratorUI';
|
---|
| 2492 | $fileName='sitemap-ui.php';
|
---|
| 2493 |
|
---|
| 2494 | if(!class_exists($className)) {
|
---|
| 2495 |
|
---|
| 2496 | $path = trailingslashit(dirname(__FILE__));
|
---|
| 2497 |
|
---|
| 2498 | if(!file_exists( $path . $fileName)) return false;
|
---|
| 2499 | require_once($path. $fileName);
|
---|
| 2500 | }
|
---|
| 2501 |
|
---|
| 2502 | $this->_ui = new $className($this);
|
---|
| 2503 |
|
---|
| 2504 | }
|
---|
| 2505 |
|
---|
| 2506 | return $this->_ui;
|
---|
| 2507 | }
|
---|
| 2508 |
|
---|
| 2509 | function HtmlShowHelp() {
|
---|
| 2510 |
|
---|
| 2511 |
|
---|
| 2512 | }
|
---|
| 2513 | } |
---|