lukaswhite/sitemap

一个用于管理和生成网站地图的PHP库

安装次数: 119

依赖者: 0

建议者: 0

安全: 0

星星: 0

关注者: 2

分支: 0

开放问题: 0

类型:项目

1.0 2018-11-12 10:45 UTC

This package is auto-updated.

Last update: 2024-09-13 00:41:30 UTC


README

一个PHP 7.1+库,用于构建网站地图,可写入各种格式;最显著的是XML网站地图。

CircleCI

安装

使用Composer安装此包

composer require lukaswhite/sitemaps

此包需要PHP版本7.1或更高

创建网站地图

use Lukaswhite\Sitemap\Sitemap;
$sitemap = Sitemap( );

您还可以提供网站地图的位置。对于某些格式,如RSS和Atom,这是必需的。

$sitemap->setLocation( 'http://example.com/sitemap.rss' );

设置网站地图被修改的日期和时间也是一个好主意;尤其是如果您正在生成网站地图列表。

$sitemap->setLastModified( new \DateTime( ) );
// or
$sitemap->setLastModified(
	( new \DateTime( ) )->setDate( 2018, 11, 15 )->setTime( 9, 45, 0 )
);
// or, if youre using Carbon:
$sitemap->setLastModified( Carbon::now( ) );

添加页面

创建具有最小信息的页面

use Lukaswhite\Sitemap\Page;

$sitemap
	->addPage(
		new Page(
			'http://www.example.com'
		)
	);

您还可以提供标题、页面最后修改的日期和时间、网站地图优先级以及/或更改频率

use Lukaswhite\Sitemap\Page;

$sitemap
	->addPage(
		new Page(
			'http://www.example.com',
			'Homepage',
			( new \DateTime( ) )->setDate( 2018, 11, 20 ),
			1,
			Page::CHANGE_FREQ_MONTHLY
		)
);

标题在XML网站地图中不被使用,但对于RSS和Atom网站地图是必需的。

网站地图优先级是一个介于0和1之间的浮点数,如果没有提供,则默认为0.5。

还有一些方便的方法可以设置页面频率

$page->alwaysChanges( );
$page->changesYearly( );
$page->changesMonthly( );
$page->changesWeekly( );
$page->changesDaily( );
$page->changesHourly( );
$page->neverChanges( );

创建XML网站地图

一旦您以编程方式创建了网站地图,最常见的情况可能是将其渲染为XML网站地图。

use Lukaswhite\Sitemap\Writer\Xml;

$writer = new Xml( $sitemap );

$xml = $writer->write( );
// or
$writer->save( '/path/to/sitemap.xml' );

如果您想提供XSL样式表,这意味着如果您直接在浏览器中访问它,可以以HTML格式提供,可以这样做

$writer->addXslStylesheet( 'http://example.com/styles.xsl' );

您可以使用 addProcessingInstruction( $name, value ) 添加任何其他处理指令。

您还可能想添加注释;例如,您可以使用此方法显示网站地图生成的时间或生成方式。

$writer->addComment( sprintf( 'Generated on %s.', date('d/m/Y' ) );
$writer->addComment( 'Generated using Sitemap by Lukas White' );

纯文本网站地图

纯文本网站地图只是一个文本文件,网站地图中包含的URL由换行符分隔。它们由Google作为XML网站地图的替代方案支持,但请注意,根据设计,优先级和更改频率等信息不会被包含,因此它们比XML网站地图更有限。

use Lukaswhite\Sitemap\Writer\Text;

$writer = new Text( $sitemap );

$text = $writer->write( );
// or
$writer->save( '/path/to/sitemap.txt' );

RSS网站地图

您还可以创建RSS格式的网站地图。

RSS编写器相当有限;您可能希望考虑使用我的feed编写器包

use Lukaswhite\Sitemap\Writer\RSS;

$writer = new RSS( $sitemap );

$feed = $writer->write( );
// or
$writer->save( '/path/to/sitemap.rss' );

为了创建有效的源,您必须设置网站地图的位置。

请注意,有效的RSS源需要<channel>元素包含标题和描述,尽管它们对于网站地图并不是必需的。因为它们是源验证所必需的,所以库输出了一些默认值。但是,如果您愿意,您也可以覆盖这些值

$writer->setChannelTitle( 'My Sitemap' );
$writer->setChannelDescription( 'This is a sitemap' );

Atom网站地图

您还可以创建Atom格式的网站地图。

Atom编写器相当有限;您可能希望考虑使用我的feed编写器包

use Lukaswhite\Sitemap\Writer\Atom;

$writer = new Atom( $sitemap );

$feed = $writer->write( );
// or
$writer->save( '/path/to/sitemap.atom' );

为了创建有效的源,您必须设置网站地图的位置。

请注意,有效的Atom源需要<feed>元素包含标题、ID和作者,尽管它们对于网站地图并不是必需的。因为它们是源验证所必需的,所以库输出了一些默认值。但是,如果您愿意,您也可以覆盖这些值

$writer->setFeedId( 'my-custom-feed-id' );
$writer->setFeedTitle( 'My Atom Sitemap Feed' );
$writer->setFeedAuthor( 'Bob', 'bob@example.com' );

您还可以使用 ->setId() 在单个页面上设置ID。

HTML网站地图

您可以使用HTML编写器生成基于HTML的网站地图。

它很简单;它只是生成一个链接的无序列表。

use Lukaswhite\Sitemap\Writer\Html;

$writer = new Html( $sitemap );

$ul = $writer->write( );

这是一个例子

$sitemap = new Sitemap( );

$sitemap
	->addPage( new Page(
	    'http://www.example.com',
	    'Homepage'
	) )
	->addPage( new Page(
		'http://www.example.com/about'
	)
);

结果

<ul>
	<li><a href="http://www.example.com" title="Homepage">Homepage</a></li>
	<li><a href="http://www.example.com/about">http://www.example.com/about</a></li>
</ul>

JSON网站地图

JSON通常不是用于网站地图的格式。但是,在某些情况下,它可能很有用。

对于大型应用,从管理员面板检查站点地图可能很有帮助。实现这一功能的一种方法是通过JSON API构建一个显示当前站点地图的组件;这就是作者可能发挥作用的地方。

use Lukaswhite\Sitemap\Writer\Json;

$writer = new Json( $sitemap );

$feed = $writer->write( );
// or
$writer->save( '/path/to/sitemap.json' );

自定义编写器

您可以根据需要创建自己的自定义编写器;只需扩展AbstractWriter并实现write()方法。

获取数据

或者,您可能希望从站点地图中提取数据以进行操作、排序或其他目的。

Sitemap类的getPages()方法返回一个包含Page类实例的数组。这进一步提供了getUrl()getTitle()getPriority()getChangeFreq()等方法。

拆分大型站点地图

如果您的站点地图开始变得非常大,您可以将其拆分为单独的文件。这是通过创建一个站点地图列表来完成的。

use Lukaswhite\Sitemap\SitemapList;
use Lukaswhite\Sitemap\Sitemap;

$list = new SitemapList( );
$list
	->addSitemap(
		( new Sitemap( ) )->setLocation(
			'http://example.com/sitemap1.xml'
		)->setLastModified( ( new \DateTime( ) )->setDate( 2018, 11, 20 ) )
	)
	->addSitemap(
		( new Sitemap( ) )->setLocation(
			'http://example.com/sitemap2.xml'
		)->setLastModified( ( new \DateTime( ) )->setDate( 2018, 11, 24 ) )
);

$list = $writer->write( );
// or
$list->save( '/path/to/sitemap-list.xml' );

请注意,为了创建一个站点地图,您必须设置站点地图的位置,这是显而易见的。

您需要创建一个Sitemap实例以创建站点地图列表,但您不一定需要同时完全构建它们,因为站点地图列表包括的只是URL和最后修改日期/时间。

对站点地图进行排序

通常,库可能会用于生成XML站点地图;在这种情况下,条目的顺序没有区别。

然而,如果您正在创建一个用于在您的后端检查的JSON表示形式,或者一个用于嵌入页面的HTML表示形式,那么对站点地图进行排序可能很有用;例如按优先级排序。

$sitemap->sortByPriority( );
// or
$sitemap->sortByTitle( );

扩展

库支持以下扩展

  • 链接
  • 图片
  • 视频

链接

链接扩展允许您指定页面的不同版本,可以是不同语言的版本或特定地区的版本。例如,在西班牙语或为英国观众提供英语。

您仍然需要像平常一样设置页面的URL——这将是页面的“默认”位置——然后您可以添加链接如下所示

$page->addAlternate( 'http://www.example.com/de', 'de' );
$page->addAlternate( 'http://www.example.com/gb', 'en-GB' );

图片

您可以将一个或多个图片与页面关联,以更有效地进行搜索引擎抓取。图片需要一个位置(URL),但也可能有一个标题、字幕、地理定位和/或许可权。

这是一个最小示例

use Lukaswhite\Sitemap\Extensions\Image;

$page->addImage(
	new Image( 'http://www.example.com/image1.jpg' )
);

这是一个更全面的示例

use Lukaswhite\Sitemap\Extensions\Image;

$page->addImage(
	( new Image( 'http://www.example.com/image1.jpg' ) )
	->setCaption( 'Test image caption' )
	->setTitle( 'Test image title' )
	->setGeoLocation( 'London' )
	->setLicense( 'http://www.example.com/license.html' )
);

视频

您还可以将一个或多个视频与页面关联。

这是一个显示大多数可用选项的示例

use Lukaswhite\Sitemap\Extensions\Video;
use Lukaswhite\Sitemap\Support\Video\Player;
use Lukaswhite\Sitemap\Support\Video\Price;
use Lukaswhite\Sitemap\Support\Video\Platform;
use Lukaswhite\Sitemap\Support\Video\Resriction;
use Lukaswhite\Sitemap\Support\Video\Uploader;

$page->addVideo(
$video =
	( new Video(  ) )
	->setTitle( 'Grilling steaks for summer' )
	->setDescription( 'Alkis shows you how to get perfectly done steaks every time' )
	->setContentLocation( 'http://streamserver.example.com/video123.mp4' )
	->setPlayer(
		new Player(
			'http://www.example.com/videoplayer.php?video=123',
			true // allow embedding
		)
	)
	->setDuration(600 )
	->setExpirationDate(
		( new \DateTime( ) )->setDate( 2021, 11, 05 )
		->setTime( 19, 20, 30 )
	)
	->setPublicationDate(
		( new \DateTime( ) )->setDate( 2007, 11, 05 )
		->setTime( 19, 20, 30 )
	)
	->setRating( 4.2 )
	->setPrice(
		( new Price( 1.99, 'EUR' ) )
		->setType( Price::OWN )
		->setResolution( Price::HD )
	)
	->addRestriction(
		( new Restriction( 'IE', 'GB', 'US', 'CA' ) )
		->allows( )
		)
	->setPlatform(
		( new Platform(
			Platform::TV,
			Platform::WEB
		) )
		->denies( )
	)
	->setLive( )
	->setFamilyFriendly( )
	->setRequiresSubscription( )
	->setViewCount( 1000 )
	->setTags( 'steak', 'grilling', 'summer' )
	->setCategories( 'Cooking', 'Beef' )
	->setUploader(
		new Uploader(
			'GrillyMcGrillerson',
			'http://www.example.com/users/grillymcgrillerson' // optional
		)
	);
);

关于上述示例的几点说明

  • 在示例中,指定了内容位置(即媒体文件的URL);需要此一个缩略图的URL——您可以使用setThumbnailLocation()设置它。
  • 示例中的价格是拥有高清版本;您可以设置类型为“租赁”和/或分辨率设置为“sd”,尽管唯一需要的信息是实际价格和货币。
  • 您可以指定按国家/地区限制;在这个示例中,我们允许英国、爱尔兰、美国和加拿大的人查看它。您还可以创建一种限制类型,拒绝某些国家的访问。
  • 您可以允许或拒绝访问特定平台(网络、移动、电视)。在这个示例中,我们拒绝访问电视和网络;因此使其仅限移动。