robots-txt-presenter.php
4.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
<?php
namespace Yoast\WP\SEO\Presenters;
use Yoast\WP\SEO\Helpers\Robots_Txt_Helper;
/**
* Presenter class for the robots.txt file helper.
*/
class Robots_Txt_Presenter extends Abstract_Presenter {
const YOAST_OUTPUT_BEFORE_COMMENT = '# START YOAST BLOCK' . \PHP_EOL . '# ---------------------------' . \PHP_EOL;
const YOAST_OUTPUT_AFTER_COMMENT = '# ---------------------------' . \PHP_EOL . '# END YOAST BLOCK';
/**
* Text to be outputted for the allow directive.
*
* @var string
*/
const ALLOW_DIRECTIVE = 'Allow';
/**
* Text to be outputted for the disallow directive.
*
* @var string
*/
const DISALLOW_DIRECTIVE = 'Disallow';
/**
* Text to be outputted for the user-agent rule.
*
* @var string
*/
const USER_AGENT_FIELD = 'User-agent';
/**
* Text to be outputted for the sitemap rule.
*
* @var string
*/
const SITEMAP_FIELD = 'Sitemap';
/**
* Holds the Robots_Txt_Helper.
*
* @var Robots_Txt_Helper
*/
protected $robots_txt_helper;
/**
* Constructor.
*
* @param Robots_Txt_Helper $robots_txt_helper The robots txt helper.
*/
public function __construct( Robots_Txt_Helper $robots_txt_helper ) {
$this->robots_txt_helper = $robots_txt_helper;
}
/**
* Generate content to be placed in a robots.txt file.
*
* @return string Content to be placed in a robots.txt file.
*/
public function present() {
$robots_txt_content = self::YOAST_OUTPUT_BEFORE_COMMENT;
$robots_txt_content = $this->handle_user_agents( $robots_txt_content );
$robots_txt_content = $this->handle_site_maps( $robots_txt_content );
return $robots_txt_content . self::YOAST_OUTPUT_AFTER_COMMENT;
}
/**
* Adds user agent directives to the robots txt output string.
*
* @param array $user_agents The list if available user agents.
* @param string $robots_txt_content The current working robots txt string.
*
* @return string
*/
private function add_user_agent_directives( $user_agents, $robots_txt_content ) {
foreach ( $user_agents as $user_agent ) {
$robots_txt_content .= self::USER_AGENT_FIELD . ': ' . $user_agent->get_user_agent() . \PHP_EOL;
$robots_txt_content = $this->add_directive_path( $robots_txt_content, $user_agent->get_disallow_paths(), self::DISALLOW_DIRECTIVE );
$robots_txt_content = $this->add_directive_path( $robots_txt_content, $user_agent->get_allow_paths(), self::ALLOW_DIRECTIVE );
$robots_txt_content .= \PHP_EOL;
}
return $robots_txt_content;
}
/**
* Adds user agent directives path content to the robots txt output string.
*
* @param string $robots_txt_content The current working robots txt string.
* @param array $paths The list of paths for which to add a txt entry.
* @param string $directive_identifier The identifier for the directives. (Disallow of Allow).
*
* @return string
*/
private function add_directive_path( $robots_txt_content, $paths, $directive_identifier ) {
if ( \count( $paths ) > 0 ) {
foreach ( $paths as $path ) {
$robots_txt_content .= $directive_identifier . ': ' . $path . \PHP_EOL;
}
}
return $robots_txt_content;
}
/**
* Handles adding user agent content to the robots txt content if there is any.
*
* @param string $robots_txt_content The current working robots txt string.
*
* @return string
*/
private function handle_user_agents( $robots_txt_content ) {
$user_agents = $this->robots_txt_helper->get_robots_txt_user_agents();
if ( ! isset( $user_agents['*'] ) ) {
$robots_txt_content .= 'User-agent: *' . \PHP_EOL;
$robots_txt_content .= 'Disallow:' . \PHP_EOL . \PHP_EOL;
}
$robots_txt_content = $this->add_user_agent_directives( $user_agents, $robots_txt_content );
return $robots_txt_content;
}
/**
* Handles adding sitemap content to the robots txt content.
*
* @param string $robots_txt_content The current working robots txt string.
*
* @return string
*/
private function handle_site_maps( $robots_txt_content ) {
$registered_sitemaps = $this->robots_txt_helper->get_sitemap_rules();
foreach ( $registered_sitemaps as $sitemap ) {
$robots_txt_content .= self::SITEMAP_FIELD . ': ' . $sitemap . \PHP_EOL;
}
return $robots_txt_content;
}
}