wp query – Uzyskaj powiązane posty pasujące do większości dostarczonych tagów za pomocą WP_Query
Nie ma bezpośredniego sposobu na dopasowanie postów większość tych tagów za pomocą WP_Query
.
Zwykłe udokumentowane metody:
Jeśli chcesz, aby posty pasowały do któregokolwiek z tych tagów, możesz użyć:
$args = array(
'post_type' => 'post',
'tag_slug__in' => array( 'poetry', 'motivational', 'attitude', 'rules', 'lines', 'sigma', 'inspirations' )
);
$query = new WP_Query( $args );
Ponadto, jeśli chcesz, aby posty pasowały do wszystkich tych tagów, możesz użyć:
$args = array(
'post_type' => 'post',
'tag_slug__and' => array( 'poetry', 'motivational', 'attitude', 'rules', 'lines', 'sigma', 'inspirations' )
);
$query = new WP_Query( $args );
Pobieranie postów z większością tych tagów:
Aby osiągnąć to, co chcesz, będziesz musiał użyć niestandardowego zapytania SQL lub niektórych zaawansowanych dostosowań do WP_Query
wygenerowane zapytanie SQL za pomocą haków.
Na przykład możesz użyć posts_clauses
hak połączony z pre_get_posts
hook, aby zmienić kod SQL wygenerowany przez WP_Query
.
Aby uzyskać posty z większość tych tagówmusisz dołączyć count( wp_term_relationships.object_id)
W SELECT
część wygenerowanego zapytania SQL, a następnie posortuj wynik zapytania według tej liczby w kolejności malejącej.
Poniżej znajduje się kod kompletnej wtyczki, która implementuje tę logikę:
<?php
/**
* Plugin Name: @fayaz.dev Related posts by most tags
* Description: Show related posts by of the provided tags
* Author: Fayaz Ahmed
* Version: 1.0.0
* Author URI:
**/
namespace Fayaz\dev;
/**
* Any WP_Query where 'order_by_most_tags' is set as an argument,
* will be altered by this function, so that the query result is
* ordered by the number of matching tags in descending order.
* However, if no matching tag is provided, then that query will not
* be altered by this.
*/
function filter_posts_by_most_tags( $query ) {
if( isset( $query->query['order_by_most_tags'] )
&& isset( $query->query_vars['tag_slug__in'] ) && ! empty( $query->query_vars['tag_slug__in'] ) ) {
add_filter( 'posts_clauses', '\Fayaz\dev\add_select_count_tags', 10, 2 );
}
}
add_action( 'pre_get_posts', '\Fayaz\dev\filter_posts_by_most_tags' );
function add_select_count_tags( $clauses, $wp_query ) {
global $wpdb;
// database query modification needed for ordering based on most tags
$clauses['fields'] = $clauses['fields'] . ', count( ' . $wpdb->term_relationships . '.object_id ) as number_of_tags';
$clauses['orderby'] = 'number_of_tags DESC, ' . $clauses['orderby'];
// we only need this once, so it's better to remove the filter after use
remove_filter( 'posts_clauses', '\Fayaz\dev\add_select_count_tags', 10, 2 );
return $clauses;
}
Przykładowe użycie wtyczki:
Powyższa wtyczka implementuje custom WP_Query
nazwa argumentu order_by_most_tags
. Po ustawieniu wtyczka zmieni wynik, aby uzyskać posty z większością dostarczonych tagów.
Po aktywowaniu wtyczki użyj kodu pokazanego poniżej w plikach szablonów aktualnie aktywnego motywu (np single.php
):
$args = array(
'post_type' => 'post',
'tag_slug__in' => array( 'poetry', 'motivational', 'attitude', 'rules', 'lines', 'sigma', 'inspirations' ),
'order_by_most_tags' => 1
);
echo '<h2>Related Posts</h2>';
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
echo '<ul>';
while ( $query->have_posts() ) {
$query->the_post();
echo '<li>';
?>
<a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a>
<?php
echo '</li>';
}
echo '</ul';
}
else {
echo '<h2>Nothing is found</h2>';
}
// Restore original Post Data, needed if this was run in a loop
wp_reset_postdata();