Um ein WordPress als Wiki ein bisschen zu missbrauchen, wollte mein Arbeitgeber auch Anhänge, die über die Mediathek zu WordPress hochgeladen wurden, über die Suche im Frontend finden. Auch wenn WordPress bereits für Anhänge eine Anhangsseite generiert, so kann man sie nur über einen direkten Aufruf finden. Man muss also den Link kennen.

Ich begab mich daher auf die Suche, wie man auch Anhänge in der Suche verfügbar macht. Dabei stieß ich auf ein vielversprechendes GitHub Gist. Hier werden vor der Ausgabe der Beiträge (pre_get_posts) die auszugebenden Inhaltstypen noch um den Typ attachment erweitert (Zeilen 15, 18), sofern es sich um eine Suche handelt ( is_search, Zeile 8).

/**
 * Allow searching for post type attachment.
 * 
 * @param	\WP_Query	$query The current query
 * @return	\WP_Query The updated query
 */
function my_attachments_search( $query ) {
	if ( ! is_search() ) {
		return $query;
	}
	
	$post_types = $query->get( 'post_type' );
	
	if ( ! $post_types || $post_types === 'post' ) {
		$post_types = [ 'post', 'attachment' ];
	}
	else if ( is_array( $post_types ) ) {
		$post_types[] = 'attachment';
	}
	
	$query->set( 'post_type', $post_types );
	$query->set( 'post_status', [ 'publish', 'inherit' ] );
	
	return $query;
}

add_filter( 'pre_get_posts', 'my_attachments_search' );
Code-Sprache: PHP (php)

Dieser Code muss dabei nur in die functions.php deines (Child-)Themes eingefügt werden und schon werden auch Anhangsseiten über die Suche gefunden, wenn sie mit dem Suchbegriff übereinstimmen.

Per Parameter steuern

Willst du die Suche dagegen über Parameter steuern, beispielsweise per https://domain.tld/?s=suchbegriff&post_type=attachment, so muss hierfür eine zusätzliche Abfrage stattfinden. Das sieht dann so aus:

/**
 * Allow searching for post type attachment.
 * 
 * @param	\WP_Query	$query The current query
 * @return	\WP_Query The updated query
 */
function my_attachments_search( $query ) {
	if ( ! is_search() ) {
		return $query;
	}
	
	if ( ! empty( $_GET['post_type'] ) ) {
		$post_types = wp_unslash( $_GET['post_type'] );
	}
	else {
		$post_types = $query->get( 'post_type' );
		
		if ( ! $post_types || $post_types === 'post' ) {
			$post_types = [ 'post', 'attachment' ];
		}
		else if ( is_array( $post_types ) ) {
			$post_types[] = 'attachment';
		}
	}
	
	$query->set( 'post_type', $post_types );
	$query->set( 'post_status', [ 'publish', 'inherit' ] );
	
	return $query;
}

add_filter( 'pre_get_posts', 'my_attachments_search' );
Code-Sprache: PHP (php)

Wenn über den Parameter post_type etwas übergeben wird, wird dann dieser Wert verwendet, um die Inhaltstypen zu filtern.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert