lukaswhite / sitemap
一个用于管理和生成网站地图的PHP库
Requires
- php: >=7.1.0
Requires (Dev)
- phpunit/php-code-coverage: ^6.0
- phpunit/phpunit: 7.0
This package is auto-updated.
Last update: 2024-09-13 00:41:30 UTC
README
一个PHP 7.1+库,用于构建网站地图,可写入各种格式;最显著的是XML网站地图。
安装
使用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”,尽管唯一需要的信息是实际价格和货币。
- 您可以指定按国家/地区限制;在这个示例中,我们允许英国、爱尔兰、美国和加拿大的人查看它。您还可以创建一种限制类型,拒绝某些国家的访问。
- 您可以允许或拒绝访问特定平台(网络、移动、电视)。在这个示例中,我们拒绝访问电视和网络;因此使其仅限移动。