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-staticpostfileswriter.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-staticpostfileswriter.php
150 lines
1 <?php
2
3 namespace WordPress\DataLiberation\EntityWriter;
4
5 use WordPress\DataLiberation\DataFormatConsumer\BlocksWithMetadata;
6 use WordPress\DataLiberation\DataLiberationException;
7 use WordPress\DataLiberation\ImportEntity;
8 use WordPress\Filesystem\Filesystem;
9
10 use function WordPress\Filesystem\wp_join_unix_paths;
11
12 class StaticPostFilesWriter implements EntityWriter {
13
14 private $filesystem;
15 private $state = self::STATE_WRITING;
16 private $directory_scheme;
17 private $parent_stack = array();
18 private $pending_parent_path = '/';
19 private $pending_post;
20 private $pending_metadata;
21 private $static_content_producer_factory;
22 private $file_extension;
23
24 const STATE_WRITING = 'writing';
25 const STATE_FINALIZING = 'finalizing';
26 const STATE_CLOSED = 'closed';
27
28 const SCHEME_DATE = 'date';
29 const SCHEME_PARENT_TRAIL = 'parent_trail';
30
31 public function __construct( Filesystem $filesystem, $options = array() ) {
32 $this->filesystem = $filesystem;
33 $this->directory_scheme = $options['directory_scheme'] ?? self::SCHEME_DATE;
34 if ( self::SCHEME_DATE !== $this->directory_scheme && self::SCHEME_PARENT_TRAIL !== $this->directory_scheme ) {
35 throw new DataLiberationException( sprintf( 'Invalid directory scheme: %s', esc_html( $this->directory_scheme ) ) );
36 }
37 if ( ! isset( $options['static_content_producer_factory'] ) ) {
38 throw new DataLiberationException( 'static_content_producer_factory is required' );
39 }
40 $this->static_content_producer_factory = $options['static_content_producer_factory'];
41 if ( ! isset( $options['file_extension'] ) ) {
42 throw new DataLiberationException( 'file_extension is required' );
43 }
44 $this->file_extension = $options['file_extension'];
45 if ( isset( $options['cursor'] ) ) {
46 $this->restore_from_cursor( $options['cursor'] );
47 }
48 }
49
50 public function append_entity( ImportEntity $entity ) {
51 if ( self::STATE_CLOSED === $this->state ) {
52 throw new DataLiberationException( 'Cannot write to a closed writer' );
53 }
54
55 $data = $entity->get_data();
56
57 switch ( $entity->get_type() ) {
58 case 'post':
59 $post_data = $entity->get_data();
60 $post_data['post_parent'] = $post_data['post_parent'] ?? 0;
61 $parent_id = $post_data['post_parent'];
62
63 // Update the parent stack.
64 $pending_post_was_a_parent = true;
65 while ( ! empty( $this->parent_stack ) && end( $this->parent_stack )['post_id'] !== $parent_id ) {
66 array_pop( $this->parent_stack );
67 $pending_post_was_a_parent = false;
68 }
69
70 if ( $this->pending_post ) {
71 $this->finalize_pending_post( $pending_post_was_a_parent );
72 }
73 if ( self::SCHEME_PARENT_TRAIL === $this->directory_scheme ) {
74 $this->pending_parent_path = $this->create_parent_trail_directory();
75 } elseif ( self::SCHEME_DATE === $this->directory_scheme ) {
76 $this->pending_parent_path = $this->create_date_based_directory( $post_data );
77 }
78 $this->pending_post = $post_data;
79 $this->pending_metadata = array();
80
81 array_push( $this->parent_stack, $post_data );
82 break;
83
84 case 'post_meta':
85 // Attach meta to the current pending post.
86 $this->pending_metadata[ $data['meta_key'] ] = array( $data['meta_value'] );
87 break;
88 }
89 }
90
91 private function finalize_pending_post( $pending_post_was_a_parent ) {
92 if ( ! $this->pending_post ) {
93 return;
94 }
95
96 $path = $this->pending_parent_path;
97 $slug = $this->slugify( $this->pending_post['post_title'] );
98 if ( self::SCHEME_PARENT_TRAIL === $this->directory_scheme ) {
99 if ( $pending_post_was_a_parent ) {
100 $path = wp_join_unix_paths( $path, $slug, 'index.' . $this->file_extension );
101 } else {
102 $path = wp_join_unix_paths( $path, $slug . '.' . $this->file_extension );
103 }
104 } else {
105 $path = wp_join_unix_paths( $path, $slug . '.' . $this->file_extension );
106 }
107
108 $this->filesystem->mkdir( dirname( $path ), array( 'recursive' => true ) );
109
110 $content = new BlocksWithMetadata( $this->pending_post['content'], $this->pending_metadata );
111 $markdown_producer = call_user_func( $this->static_content_producer_factory, $content );
112 $contents = $markdown_producer->produce();
113
114 $this->filesystem->put_contents( $path, $contents );
115 }
116
117 private function create_parent_trail_directory() {
118 $base_path_segments = array( '/' );
119 foreach ( $this->parent_stack as $parent_post ) {
120 $base_path_segments[] = $this->slugify( $parent_post['post_title'] );
121 }
122
123 return wp_join_unix_paths( ...$base_path_segments );
124 }
125
126 private function create_date_based_directory( $post_data ) {
127 $base_path_segments = explode( '-', substr( $post_data['post_date'], 0, 10 ) );
128
129 return wp_join_unix_paths( ...$base_path_segments );
130 }
131
132 private function slugify( $title ) {
133 return preg_replace( '/[^a-z0-9]+/i', '-', trim( strtolower( $title ) ) );
134 }
135
136 public function close_writing() {
137 $this->state = self::STATE_FINALIZING;
138 $this->finalize_pending_post( false );
139 $this->state = self::STATE_CLOSED;
140 }
141
142 public function get_reentrancy_cursor(): string {
143 throw new DataLiberationException( 'Not implemented' );
144 }
145
146 private function restore_from_cursor( $cursor ) {
147 throw new DataLiberationException( 'Not implemented' );
148 }
149 }
150