PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.1-beta.3
Jetpack – WP Security, Backup, Speed, & Growth v16.1-beta.3
16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / vendor / wp-php-toolkit / data-liberation / EntityWriter / class-wxrwriter.php
jetpack / vendor / wp-php-toolkit / data-liberation / EntityWriter Last commit date
class-mysqldumpwriter.php 6 days ago class-staticpostfileswriter.php 6 days ago class-wxrwriter.php 6 days ago interface-entity-writer.php 6 days ago
class-wxrwriter.php
161 lines
1 <?php
2
3 namespace WordPress\DataLiberation\EntityWriter;
4
5 use WordPress\ByteStream\WriteStream\ByteWriteStream;
6 use WordPress\DataLiberation\DataLiberationException;
7 use WordPress\DataLiberation\ImportEntity;
8 use WordPress\XML\XMLProcessor;
9
10 class WXRWriter implements EntityWriter {
11
12 private $write_stream;
13 private $state = self::STATE_WRITING;
14 private $open_tags = array();
15
16 const STATE_NEW = 'new';
17 const STATE_WRITING = 'writing';
18 const STATE_CLOSED = 'closed';
19
20 public function __construct( ByteWriteStream $write_stream, $cursor = null ) {
21 $this->write_stream = $write_stream;
22
23 if ( null === $cursor ) {
24 $this->write_stream->append_bytes( "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<rss version=\"2.0\" xmlns:excerpt=\"http://wordpress.org/export/1.2/excerpt/\" xmlns:content=\"http://purl.org/rss/1.0/modules/content/\" xmlns:wfw=\"http://wellformedweb.org/CommentAPI/\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:wp=\"http://wordpress.org/export/1.2/\">\n<channel>\n" );
25 } else {
26 $this->open_tags = json_decode( $cursor, true )['open_tags'];
27 }
28 }
29
30 public function append_entity( ImportEntity $entity ) {
31 if ( self::STATE_CLOSED === $this->state ) {
32 throw new DataLiberationException( 'Cannot write to a closed writer' );
33 }
34
35 if ( 'comment' !== $entity->get_type() && ! empty( $this->open_tags ) && 'wp:comments' === end( $this->open_tags ) ) {
36 $this->write_stream->append_bytes( "</wp:comments>\n" );
37 array_pop( $this->open_tags );
38 }
39
40 switch ( $entity->get_type() ) {
41 case 'post':
42 if ( ! empty( $this->open_tags ) && 'item' === end( $this->open_tags ) ) {
43 $this->write_stream->append_bytes( "</item>\n" );
44 array_pop( $this->open_tags );
45 }
46 $this->write_stream->append_bytes( "<item>\n" );
47 $this->open_tags[] = 'item';
48 $this->append_if_not_empty( 'title', $entity->get_data()['post_title'] );
49 $this->append_if_not_empty( 'pubDate', $entity->get_data()['post_date'] );
50 $this->append_if_not_empty( 'guid', $entity->get_data()['guid'] );
51 $this->append_if_not_empty( 'description', $entity->get_data()['description'] );
52 $this->append_if_not_empty( 'content:encoded', $entity->get_data()['content'] );
53 $this->append_if_not_empty( 'excerpt:encoded', $entity->get_data()['excerpt'] );
54 $this->append_if_not_empty( 'wp:post_id', $entity->get_data()['post_id'] );
55 $this->append_if_not_empty( 'wp:post_date', $entity->get_data()['post_date'] );
56 $this->append_if_not_empty( 'wp:post_date_gmt', $entity->get_data()['post_date_gmt'] );
57 $this->append_if_not_empty( 'wp:comment_status', $entity->get_data()['comment_status'] );
58 $this->append_if_not_empty( 'wp:ping_status', $entity->get_data()['ping_status'] );
59 $this->append_if_not_empty( 'wp:post_name', $entity->get_data()['post_name'] );
60 $this->append_if_not_empty( 'wp:status', $entity->get_data()['status'] );
61 $this->append_if_not_empty( 'wp:post_parent', $entity->get_data()['post_parent'] );
62 $this->append_if_not_empty( 'wp:menu_order', $entity->get_data()['menu_order'] );
63 $this->append_if_not_empty( 'wp:post_type', $entity->get_data()['post_type'] );
64 $this->append_if_not_empty( 'wp:post_password', $entity->get_data()['post_password'] );
65 $this->append_if_not_empty( 'wp:is_sticky', $entity->get_data()['is_sticky'] );
66 break;
67 case 'post_meta':
68 if ( empty( $this->open_tags ) || 'item' !== end( $this->open_tags ) ) {
69 throw new DataLiberationException( 'Cannot append post_meta without a corresponding post' );
70 }
71 $meta = $entity->get_data();
72 $this->write_stream->append_bytes( "<wp:postmeta>\n" );
73 $this->append_if_not_empty( 'wp:meta_key', $meta['meta_key'] );
74 $this->append_if_not_empty( 'wp:meta_value', $meta['meta_value'] );
75 $this->write_stream->append_bytes( "</wp:postmeta>\n" );
76 break;
77 case 'term':
78 if ( empty( $this->open_tags ) || 'item' !== end( $this->open_tags ) ) {
79 throw new DataLiberationException( 'Cannot append term without a corresponding post' );
80 }
81 $term = $entity->get_data();
82 $this->write_stream->append_bytes( "<wp:term>\n" );
83 $this->append_if_not_empty( 'wp:term_id', $term['term_id'] );
84 $this->append_if_not_empty( 'wp:term_taxonomy', $term['taxonomy'] );
85 $this->append_if_not_empty( 'wp:term_slug', $term['slug'] );
86 $this->append_if_not_empty( 'wp:term_parent', $term['parent'] );
87 $this->write_stream->append_bytes( "</wp:term>\n" );
88 break;
89 case 'comment':
90 if ( empty( $this->open_tags ) ) {
91 throw new DataLiberationException( 'Cannot append comment without a corresponding post' );
92 }
93 if ( 'item' === end( $this->open_tags ) ) {
94 $this->write_stream->append_bytes( "<wp:comments>\n" );
95 $this->open_tags[] = 'wp:comments';
96 }
97 if ( 'wp:comments' !== end( $this->open_tags ) ) {
98 throw new DataLiberationException( 'Cannot append comment outside of a comment list' );
99 }
100 $comment = $entity->get_data();
101 $this->write_stream->append_bytes( "<wp:comment>\n" );
102 $this->append_if_not_empty( 'wp:comment_id', $comment['comment_id'] );
103 $this->append_if_not_empty( 'wp:comment_author', $comment['comment_author'] );
104 $this->append_if_not_empty( 'wp:comment_author_email', $comment['comment_author_email'] );
105 $this->append_if_not_empty( 'wp:comment_author_url', $comment['comment_author_url'] );
106 $this->append_if_not_empty( 'wp:comment_author_IP', $comment['comment_author_IP'] );
107 $this->append_if_not_empty( 'wp:comment_date', $comment['comment_date'] );
108 $this->append_if_not_empty( 'wp:comment_date_gmt', $comment['comment_date_gmt'] );
109 $this->append_if_not_empty( 'wp:comment_content', $comment['comment_content'] );
110 $this->append_if_not_empty( 'wp:comment_approved', $comment['comment_approved'] );
111 $this->append_if_not_empty( 'wp:comment_type', $comment['comment_type'] );
112 $this->append_if_not_empty( 'wp:comment_parent', $comment['comment_parent'] );
113 $this->append_if_not_empty( 'wp:comment_user_id', $comment['comment_user_id'] );
114 $this->write_stream->append_bytes( "</wp:comment>\n" );
115 break;
116 }
117 }
118
119 private function append_if_not_empty( $tag_name, &$content ) {
120 if ( null !== $content ) {
121 $this->write_stream->append_bytes( $this->create_xml_tag( $tag_name, $content ) );
122 }
123 }
124
125 private function create_xml_tag( $tag_name, $content ) {
126 $xml = XMLProcessor::create_from_string(
127 "<$tag_name>text</$tag_name>\n",
128 null,
129 'UTF-8',
130 array(
131 'excerpt' => 'http://wordpress.org/export/1.2/excerpt/',
132 'content' => 'http://purl.org/rss/1.0/modules/content/',
133 'wfw' => 'http://wellformedweb.org/CommentAPI/',
134 'dc' => 'http://purl.org/dc/elements/1.1/',
135 'wp' => 'http://wordpress.org/export/1.2/',
136 )
137 );
138 $xml->next_token(); // Move to the opening tag.
139 $xml->next_token(); // Move to the text node.
140 $xml->set_modifiable_text( $content );
141
142 return $xml->get_updated_xml();
143 }
144
145 public function finalize() {
146 while ( ! empty( $this->open_tags ) ) {
147 $tag = array_pop( $this->open_tags );
148 $this->write_stream->append_bytes( "</$tag>\n" );
149 }
150 $this->write_stream->append_bytes( "</channel>\n</rss>\n" );
151 }
152
153 public function close_writing() {
154 $this->state = self::STATE_CLOSED;
155 }
156
157 public function get_reentrancy_cursor(): string {
158 return json_encode( array( 'open_tags' => $this->open_tags ) );
159 }
160 }
161