Test auf Post-Typ im Anfrage-Filter?

Ich stoße in eine Catch-22-Situation, in der ein Anforderungsfilter läuft. Ich brauche die Anfrage, um korrekt zu sein, um den richtigen Filter auszuführen, aber ich brauche den Filter, um die Anfrage zu korrigieren. GAH!

Hier ist der Code:

function cpt_parse_taxonomy_string( $request, $cpt, $ctax ){ if( array_key_exists( $ctax , $request ) && ! get_term_by( 'slug', $request[$ctax], $ctax ) ){ $request[$cpt] = $request[$ctax]; $request['name'] = $request[$ctax]; $request['post_type'] = $cpt; unset( $request[$ctax] ); } return $request; } function cpt_request_filters( $request ) { global $post; if ( 'toys' == get_post_type( $post ) ) { return cpt_parse_taxonomy_string( $request, 'toys', 'toy_series' ); } if ( 'books' == get_post_type( $post ) ) { return cpt_parse_taxonomy_string( $request, 'books', 'book-publishers-series' ); } return $request; } add_filter( 'request', 'cpt_request_filters' ); 

In dem Bemühen, meinen Code DRY zu halten und keinen redundanten Filter für jeden betroffenen Post-Typ zu verwenden, versuchte ich, den Großteil des Codes in eine wiederverwendbare function zu überführen. Die function wird jedoch nie ausgeführt.

Die zweite function ist, wo ich die Schwierigkeit habe. Ich versuche, den globalen $ -Posten aufzurufen, aber ich denke, ich versuche, es zu früh zu bekommen. Es existiert noch nicht, also kommt es in Null, was den Rest meiner Bedingungen zum Scheitern bringt und die erste function läuft nie für einen benutzerdefinierten Post-Typ, für den ich teste. Dann dachte ich vielleicht, ich könnte mir die Anfrage selbst anschauen, um die benötigten Informationen zu erhalten, aber da der Filter noch nicht ausgeführt wurde, ist die Anfrage möglicherweise falsch und meine Bedingungen werden nicht korrekt ausgeführt.

Wie kann ich den Post erhalten oder wie kann ich diese Post-Typen testen?

Vielen Dank!

Solutions Collecting From Web of "Test auf Post-Typ im Anfrage-Filter?"

$request['post_type'] sollte den angeforderten Post-Typ für jeden benutzerdefinierten Typ enthalten. Der Standardposttyp hat einen name , aber keinen post_type . Seiten haben pagename und keinen post_type .

EDIT – Bestimmen des benutzerdefinierten Post-Typs basierend auf der in der Anforderung festgelegten Taxonomie:

 function cpt_request_filters( $request ){ if( ! is_admin() ){ global $wp_taxonomies; foreach( $request as $tax_key => $value ){ if( array_key_exists( $tax_key, $wp_taxonomies ) ){ return cpt_parse_taxonomy_string( $request, $wp_taxonomies[$tax_key]->object_type[0], $tax_key ); } } } return $request; } add_filter( 'request', 'cpt_request_filters' ); 

Hier ist der Code, den ich bekommen habe. Es ist nicht so elegant wie Milos Antwort, aber es funktioniert in meinen Tests:

EDIT: aufgeräumt und kommentiert den Code

 //----------------------------------------------------- // CONVERT TAXONOMY REQUEST TO POST REQUEST // This function looks at the request and determines // if a taxonomy request should be a post request // and then converts it. // This allows for unknown taxonomy depths/lengths: // basename/parent/ // basename/parent/child < Prevents this from // basename/parent/post < being confused with this // basename/parent/child/post //----------------------------------------------------- function convert_tax_request_to_post( $request, $cpt, $ctax ){ // If the checked taxonomy is in the request && // The slug is not a term for this taxonomy // (Which would indicate it's actually a post slug/name) if( array_key_exists( $ctax , $request ) && ! get_term_by( 'slug', $request[$ctax], $ctax ) ){ // Set the post type name of the request to the post name // Ex: toys => toy-name $request[$cpt] = $request[$ctax]; // Set the post_type of the request to the post type // Ex: post_type => toys $request['post_type'] = $cpt; // Set the post name of the request to the post name // Ex: name => toy-name $request['name'] = $request[$ctax]; // Remove the taxonomy key/value from the request unset( $request[$ctax] ); } return $request; } //----------------------------------------------------- // REQUEST FILTERS // For more complex hierarchies when a simple rewrite // rule isn't enough logic. // Utilizes the functions above to remain DRY. //----------------------------------------------------- function cpt_request_filters( $request ) { // Include array of all CPT/Taxonomy pairs to be checked global $add_taxonomy; // Do not run this filter on admin pages if (! is_admin() ) { // Does the request already have a post_type defined? if (!key_exists( 'post_type', $request ) ) { // Look at the request data foreach ($request AS $key => $value) { // Detect if a post is being confused as a taxonomy term // It would have term-name => post-slug in its array if ( taxonomy_exists( $key ) ) { if ( !term_exists( $value, $key ) ) { // There is a mismatch... // Get the post type associated with the // taxonomy term in the request $taxonomy = get_taxonomy($key); // Get all post types associated with this taxonomy $post_types = $taxonomy->object_type; // Set the post_type as the first post type associated // with this taxonomy - there should only be one // if the CPTs and taxonomies are set up correctly // for the $add_taxonomy CPTs looped below. if ( is_array($post_types) ) { $post_type = $post_types[0]; } } } } } else { // post_type as defined by the clean request $post_type = $request['post_type']; } if ( isset($post_type) && strlen($post_type) > 0 ) { // Loop through CPT/taxonomy pairs foreach ($add_taxonomy AS $cpt=>$info) { // If a checked CPT matches the post_type from the request if ( $cpt == $post_type ) { // Convert the taxomy request into a post request return convert_tax_request_to_post( $request, $cpt, $info['taxonomy'] ); } } } } // end is_admin() check // Default: Return the initial request return $request; } add_filter( 'request', 'cpt_request_filters' );