Jak poprawnie oznaczyć odblokowane przez usera wpisy? [wordpress]

0

Utworzyłem w WordPressie niestandardowy typ treści z kategoriami. Użytkownicy mogą odblokowywać dostęp do pojedynczych wpisów indywidualnie za pomocą zebranych punktów (używam do tego wtyczki mycred).

Chciałbym wyświetlić w profilu użytkownika (BuddyPress) listę wszystkich postów pogrupowanych według kategorii oraz z oznaczeniem czy użytkownik odblokował dany wpis.

Z wyświetleniem listy wpisów z danej kategorii nie mam problemu, wygląda to następująco:

$xyz_args = array(
    'post_type' => 'books',
    'tax_query' => array(
        array (
            'taxonomy' => 'books_cat',
            'field' => 'slug',
            'terms' => 'xyz',
        )
    ),
);
$xyz_query = new WP_Query( $xyz_args );


if ( $xyz_query->have_posts() ) {
echo 'Wpisy z kategorii XYZ:';
while ( $xyz_query->have_posts() ) {
    $xyz_query->the_post();
    echo '<a href="' . get_permalink() . '" title="'. get_the_title() . '""><img src="' . get_the_post_thumbnail_url() .'"></a>';
}
}

Do wyświetlenia wszystkich wpisów odblokowanych przez użytkownika służy specjalna funkcja która bierze z bazy ID wpisu, ID użytkownika i inne dane (nie bierze kategorii wpisu). Tak to wygląda jeśli chcę wywołać listę odblokowanych wpisów:

$user_id = bp_displayed_user_id( );
$purchases = mycred_get_users_purchased_content( $user_id, $number, $order, $ctype );

if ( ! empty( $purchases ) ) {
	foreach ( $purchases as $entry ) {
		if (has_term('xyz', 'books_cat', $entry->ref_id)) { // wyświetl jeśli wpis jest w określonej kategorii
			echo '<a href="' . mycred_get_permalink( $entry->ref_id ) . '" title="'. mycred_get_the_title( $entry->ref_id ) .'">';
			echo '<img src="' . get_the_post_thumbnail_url($entry->ref_id) .'">';
			echo '</a>';
		}
	}
}

Chciałbym aby na stronie ostatecznie wyglądało to mniej więcej tak:

<h4>Wpisy z kategorii XYZ</h4>
<a href="..." class="zablokowane" title="Odblokuj teraz">...</a>
<a href="..." class="posiadasz" title="Wpis X">...</a>
<a href="..." class="posiadasz" title="Wpis Y">...</a>
<a href="..." class="posiadasz" title="Wpis Z">...</a>

<h4>Wpisy z kategorii ABC</h4>
<a href="..." class="posiadasz" title="Wpis A">...</a>
<a href="..." class="zablokowane" title="Odblokuj teraz">...</a>
<a href="..." class="zablokowane" title="Odblokuj teraz">...</a>
<a href="..." class="zablokowane" title="Odblokuj teraz">...</a>

Nie wiem do końca jak to ze sobą połączyć. Pomoże ktoś?

0

@R P: Ja bym zrobił to w sposób następujący:

<?php
$args = [
        'taxonomy' => 'books_cat',
        'hide_empty' => false,
    ];

    $categories = get_terms($args);
    $outputResults = [];
    foreach($categories as $category) {
        if ( ! empty( $purchases ) ) {
            foreach ( $purchases as $entry ) {
                if (has_term($category->slug, 'books_cat', $entry->ref_id)) {
                    $outputResults[$category->slug][] = $entry;
            }
        }
    }
}

W $outputResults będziesz miał tablicę przygotowaną do widoku posortowaną według pobranych kategorii, którą sobie później rozbijesz przez foreach.

0

@leonpro778:

Chyba coś nie do końca to działa jak bym chciał. Nie pokazują się wszystkie posty tylko te odblokowane przez użytkownika.
Bardziej mi chodzi o to aby wyświetlały się wszystkie wpisy z jednej konkretnej kategorii i te odblokowane aby posiadały dodatkowo np. klasę css, inny atrybut title.
Nie ma jakiegoś sposobu aby porównać czy w $purchases i $xyz_query istnieje ten sam post po jego ID? I jeśli istnieje:

if (jeśli istnieje) {
 echo '<a href="..." class="istnieje" title="Nazwa wpisu">Nazwa wpisu</a>';
} else {
 echo '<a href="..." class="nie istnieje" title="Nie odblokowano">Nazwa wpisu</a>';
}

Niestety nie znam się aż tak bardzo aby sobie z tym poradzić.

0

No to w tym skrypcie powyżej zmień $purchases na $xyz_query. Jak pobierzesz sobie $purchases wyciągnij z tego TYLKO id postów i następnie funkcją:

if (in_array($xyz_query, $purchasesId) {
    // ustaw sobie co tam chcesz
     $outputResults[$category->slug][] = [
        'post' => $entry,
        'is_purchased' => true,
        // i inne pola jakie tam chcesz
    ];
}
0

@leonpro778: Dzięki za pomoc!

Mimo wszystko udało mi się znaleźć inne rozwiązanie. W plikach wtyczki znalazłem funkcję która ułatwia osiągnięcie tego czego potrzebuję.

1 użytkowników online, w tym zalogowanych: 0, gości: 1