Filtern Sie den Wochentag nach dem Zeitstempel

Ich versuche, die Anzeige von Posts nach dem Wochentag (1 = Mon, 2 = Di, usw.) im Admin-Bearbeitungsbereich zu filtern. Das benutzerdefinierte Feld ‘some-date’ ist ein Zeitstempel. Der folgende Code ist nicht der richtige Ansatz dafür, sondern veranschaulicht, was ich erreichen möchte.

// Filter on day of week add_filter( 'parse_query', array( &$this, 'dayFilter' ), 10); // Filter the query on the day of the week held by custom timestamp field 'some-date' public function dayFilter( $query ) { // Essential code below $qv = &$query->query_vars; $qv['meta_query'] = []; // Filter on the day of week if ( !empty( $_GET['filter_day_of_Week'] ) ) { $day = intval( $_GET['filter_day_of_Week'], 10 ); $qv['meta_query'][] = array( 'key' => 'WEEKDAY(FROM_UNIXTIME(wpcf-some-date))', 'value' => $day, 'compare' => 'IS' ); $sort_key = 'wpcf-some-date'; } } 

Nicht hier, aber irgendwo muss ich WEEKDAY(FROM_UNIXTIME(wpcf-some-date)) in die SQL-Anfrage bekommen. Ich habe darüber nachgedacht, die SQL-Anforderungszeichenfolge im posts_request Filter-Hook zu posts_request , aber wenn jemand einen besseren Vorschlag hat, würde ich es posts_request .

Solutions Collecting From Web of "Filtern Sie den Wochentag nach dem Zeitstempel"

Diese Antwort kann jemandem helfen, der seine Filter wirklich anpassen möchte. Mit PHPStorm und Breakpoints konnte ich durchgehen, wie die meta_query wird, bevor Posts geholt werden. Es gibt keine Hook-Punkte im Flow, die Entwickler dies erreichen lassen; Ich habe einen SQL-Injektion Trick verwendet, um den Filter zu erreichen.

 // Do advanced SQL editing for filtering the days of the week add_filter( 'posts_where_request', array( &$this, 'processSQLDelMarkers' ), 99, 2 ); /** * Manipulate the pre-flight SQL query to filter on the day of the week. * Remove any ##DEL## marker as well as the next character after it * @param $where * @return mixed */ public function processSQLDelMarkers($where, \WP_Query &$query) { // Special gate if (stripos($where, '##DEL##') === false) { return $where; } // ... security checks omitted for brevity ... /** * Sample where clause before adjustment: * ... AND ihs_postmeta.meta_value != '##DEL##\' AND WEEKDAY(FROM_UNIXTIME(ihs_postmeta.meta_value)) = 4##DEL##' ) ... * becomes * ... AND ihs_postmeta.meta_value != '' AND WEEKDAY(FROM_UNIXTIME(ihs_postmeta.meta_value)) = 4 ) ... */ return preg_replace( '(##DEL##.?)', '', $where ); } 

Dann könnte ich mit einem sorgfältig konstruierten Meta- value und einem Dummy- compare wie so (siehe Code in der ursprünglichen Frage) die SQL-Injection erreichen:

 $qv['meta_query'][] = array( 'key' => '##DEL##\' AND WEEKDAY(FROM_UNIXTIME(ihs_postmeta.meta_value)) = 4##DEL##', 'value' => $day, 'compare' => '!=' ); 

Hinweis : Mit den richtigen Sicherheitsprüfungen sollte es nicht möglich sein, unerwünschte SQL-Strings einzufügen.