PluginProbe
Redirection / 5.2
Redirection v5.2
5.10.0 5.9.0 5.8.1 5.8.0 3.7.2 3.7.3 4.0 4.0.1 4.1 4.1.1 4.2 4.2.1 4.2.2 4.2.3 4.3 4.3.1 4.3.2 4.3.3 4.4 4.4.1 4.4.2 4.5 4.5.1 4.6.2 4.7.1 All 130 releases
redirection / fileio / csv.php

csv.php in Redirection 5.2, at fileio/csv.php

133 lines 3.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 class Red_Csv_File extends Red_FileIO {
4 const CSV_SOURCE = 0;
5 const CSV_TARGET = 1;
6 const CSV_REGEX = 2;
7 const CSV_CODE = 3;
8
9 public function force_download() {
10 parent::force_download();
11
12 header( 'Content-Type: text/csv' );
13 header( 'Content-Disposition: attachment; filename="' . $this->export_filename( 'csv' ) . '"' );
14 }
15
16 public function get_data( array $items, array $groups ) {
17 $lines = [ implode( ',', array( 'source', 'target', 'regex', 'type', 'code', 'match', 'hits', 'title' ) ) ];
18
19 foreach ( $items as $line ) {
20 $lines[] = $this->item_as_csv( $line );
21 }
22
23 return implode( PHP_EOL, $lines ) . PHP_EOL;
24 }
25
26 public function item_as_csv( $item ) {
27 $data = $item->match->get_data();
28 $data = isset( $data['url'] ) ? $data = $data['url'] : '*';
29
30 $csv = array(
31 $item->get_url(),
32 $data,
33 $item->is_regex() ? 1 : 0,
34 $item->get_action_type(),
35 $item->get_action_code(),
36 $item->get_action_type(),
37 $item->get_hits(),
38 $item->get_title(),
39 );
40
41 $csv = array_map( array( $this, 'escape_csv' ), $csv );
42 return implode( ',', $csv );
43 }
44
45 public function escape_csv( $item ) {
46 return '"' . str_replace( '"', '""', $item ) . '"';
47 }
48
49 public function load( $group, $filename, $data ) {
50 ini_set( 'auto_detect_line_endings', true );
51
52 $file = fopen( $filename, 'r' );
53
54 ini_set( 'auto_detect_line_endings', false );
55
56 $count = 0;
57 if ( $file ) {
58 $separators = [
59 ',',
60 ';',
61 '|',
62 ];
63
64 foreach ( $separators as $separator ) {
65 fseek( $file, 0 );
66 $count = $this->load_from_file( $group, $file, $separator );
67
68 if ( $count > 0 ) {
69 return $count;
70 }
71 }
72 }
73
74 return 0;
75 }
76
77 public function load_from_file( $group_id, $file, $separator ) {
78 $count = 0;
79
80 while ( ( $csv = fgetcsv( $file, 5000, $separator ) ) ) {
81 $item = $this->csv_as_item( $csv, $group_id );
82
83 if ( $item ) {
84 $created = Red_Item::create( $item );
85
86 if ( ! is_wp_error( $created ) ) {
87 $count++;
88 }
89 }
90 }
91
92 return $count;
93 }
94
95 private function get_valid_code( $code ) {
96 if ( get_status_header_desc( $code ) !== '' ) {
97 return intval( $code, 10 );
98 }
99
100 return 301;
101 }
102
103 public function csv_as_item( $csv, $group ) {
104 if ( count( $csv ) > 1 && $csv[ self::CSV_SOURCE ] !== 'source' && $csv[ self::CSV_TARGET ] !== 'target' ) {
105 return array(
106 'url' => trim( $csv[ self::CSV_SOURCE ] ),
107 'action_data' => array( 'url' => trim( $csv[ self::CSV_TARGET ] ) ),
108 'regex' => isset( $csv[ self::CSV_REGEX ] ) ? $this->parse_regex( $csv[ self::CSV_REGEX ] ) : $this->is_regex( $csv[ self::CSV_SOURCE ] ),
109 'group_id' => $group,
110 'match_type' => 'url',
111 'action_type' => 'url',
112 'action_code' => isset( $csv[ self::CSV_CODE ] ) ? $this->get_valid_code( $csv[ self::CSV_CODE ] ) : 301,
113 );
114 }
115
116 return false;
117 }
118
119 private function parse_regex( $value ) {
120 return intval( $value, 10 ) === 1 ? true : false;
121 }
122
123 private function is_regex( $url ) {
124 $regex = '()[]$^*';
125
126 if ( strpbrk( $url, $regex ) === false ) {
127 return false;
128 }
129
130 return true;
131 }
132 }
133