PluginProbe
Redirection / 4.5
Redirection v4.5
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 4.5, at fileio/csv.php

126 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 join( $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 $count = $this->load_from_file( $group, $file, ',' );
59
60 // Try again with semicolons - Excel often exports CSV with semicolons
61 if ( $count === 0 ) {
62 fseek( $file, 0 );
63 $count = $this->load_from_file( $group, $file, ';' );
64 }
65 }
66
67 return $count;
68 }
69
70 public function load_from_file( $group_id, $file, $separator ) {
71 $count = 0;
72
73 while ( ( $csv = fgetcsv( $file, 5000, $separator ) ) ) {
74 $item = $this->csv_as_item( $csv, $group_id );
75
76 if ( $item ) {
77 $created = Red_Item::create( $item );
78
79 if ( ! is_wp_error( $created ) ) {
80 $count++;
81 }
82 }
83 }
84
85 return $count;
86 }
87
88 private function get_valid_code( $code ) {
89 if ( get_status_header_desc( $code ) !== '' ) {
90 return intval( $code, 10 );
91 }
92
93 return 301;
94 }
95
96 public function csv_as_item( $csv, $group ) {
97 if ( count( $csv ) > 1 && $csv[ self::CSV_SOURCE ] !== 'source' && $csv[ self::CSV_TARGET ] !== 'target' ) {
98 return array(
99 'url' => trim( $csv[ self::CSV_SOURCE ] ),
100 'action_data' => array( 'url' => trim( $csv[ self::CSV_TARGET ] ) ),
101 'regex' => isset( $csv[ self::CSV_REGEX ] ) ? $this->parse_regex( $csv[ self::CSV_REGEX ] ) : $this->is_regex( $csv[ self::CSV_SOURCE ] ),
102 'group_id' => $group,
103 'match_type' => 'url',
104 'action_type' => 'url',
105 'action_code' => isset( $csv[ self::CSV_CODE ] ) ? $this->get_valid_code( $csv[ self::CSV_CODE ] ) : 301,
106 );
107 }
108
109 return false;
110 }
111
112 private function parse_regex( $value ) {
113 return intval( $value, 10 ) === 1 ? true : false;
114 }
115
116 private function is_regex( $url ) {
117 $regex = '()[]$^*';
118
119 if ( strpbrk( $url, $regex ) === false ) {
120 return false;
121 }
122
123 return true;
124 }
125 }
126