WordPress

wp query – Uzyskaj powiązane posty pasujące do większości dostarczonych tagów za pomocą WP_Query

  • 8 lutego, 2023
  • 4 min read
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.

Warto przeczytać!  javascript — Blok WordPress Gutenberg z komponentem Border Box Control nie działa

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();


Źródło