Ich habe derzeit die Option in meinem CMS, Tags zu meiner benutzerdefinierten Beitragstyp-Einzelseite hinzuzufügen.
Jetzt möchte ich dieses Tag als “empfohlenes” Element anzeigen. In meinem Taxonomie-‘Dateinamen’ verwende ich also den folgenden Code, der die Tags sammelt und sie auf der Taxonomie-Seite anzeigt:
<?php
$args = array(
'tag_slug__and' => array('sector1'),
'post_type' => array( 'sectors' )
);
$loop = new WP_Query( $args );
while ($loop->have_posts() ) : $loop->the_post();
?>
<a href="https://stackoverflow.com/questions/30256167/<?php echo get_permalink(); ?>">
<?php echo "<div class="col-md-6" style="margin-bottom:20px;">"; ?>
<div class="row mobilemargin">
<div class="categorytiletextsector1">
<div class="col-md-6 col-sm-6 col-xs-12 nopr"><?php echo get_the_post_thumbnail( $page->ID, 'categoryimage', array('class' => 'sector1img hovereffect')); ?> </div>
<div class="col-md-6 col-sm-6 col-xs-12">
<div class="testdiv">
<h5><?php the_title(); ?></h5>
<p><?php the_excerpt(); ?></p>
</div>
</div>
</div>
</div>
<?php echo "</div>"; ?>
</a>
<?php endwhile; ?>
<?php wp_reset_query(); ?>
Mein Problem ist nun, dass das ausgewählte Tag jetzt auf jeder Kategorieseite angezeigt wird, wie es auf der Taxonomieseite festgelegt ist.
Wie kann ich das nur auf die aktuelle Kategorie einstellen.
Wenn also mein Artikel in der „Kategorie A“ ist, würde dies nur auf der Kategorieseite von „A“ angezeigt, wenn die Artikelkategorie verwendet wird?
Jede Hilfe wäre großartig
Bearbeiten. Habe diesen Code verwendet, in der Hoffnung, dass dies funktionieren sollte, aber kein Glück
$args = array(
'tag_slug__and' => array( 'sector1' ),
'post_type' => array( 'sectors' ),
'tax_query' => array(
array(
'taxonomy' => 'sectors',
'terms' => get_queried_object_id(),
),
),
);
Ihr Problem ist Ihre benutzerdefinierte Abfrage. Ein sehr wichtiger Hinweis hier ist, niemals die Hauptabfrage durch eine benutzerdefinierte Abfrage auf irgendeiner Art von Archivseite oder der Homepage zu ersetzen. Ich habe alles ausführlich in diesem Beitrag kürzlich erklärt. Stellen Sie sicher, dass Sie es und alle verlinkten Beiträge lesen, da Sie davon sehr profitieren werden
Ihre Lösung wäre, Ihre benutzerdefinierte Abfrage zu entfernen und diese durch die uns allen bekannte Standardschleife zu ersetzen
if ( have_posts() ) {
while ( have_posts() ) {
the_post();
// Your template tags and html mark up
}
}
Wenn Sie etwas in der Hauptabfrage ändern müssen, verwenden Sie pre_get_posts
dazu
BEARBEITEN
Ihre beste Idee wäre hier, eine volle zu verwenden tax_query
um Beiträge anzuzeigen, die sich im ausgewählten Taxonomie-Begriff und -Tag befinden
Sie können so etwas versuchen: (Benötigt mindestens PHP 5.4+. Auch dies ungetestet)
$q = get_queried_object();
$args = [
'post_type' => 'sectors',
'tax_query' => [
[
'taxonomy' => $q->taxonomy,
'terms' => $q->term_id,
'include_children' => false // Exclude child terms
],
[
'taxonomy' => 'post_tag',
'field' => 'slug',
'terms' => 'sector1', //I believe this is the slug
],
],
];
Verwenden Sie für ältere PHP-Versionen Folgendes
$q = get_queried_object();
$args = array(
'post_type' => 'sectors',
'tax_query' => array(
array(
'taxonomy' => $q->taxonomy,
'terms' => $q->term_id,
'include_children' => false // Exclude child terms
),
array(
'taxonomy' => 'post_tag',
'field' => 'slug',
'terms' => 'sector1', //I believe this is the slug
),
),
);
BEARBEITEN 2
Um Beiträge auszuschließen, die sich in der sector1
Tag und alle anderen sectorX
-Tag können Sie Folgendes tun
Sie können so etwas versuchen: (Benötigt mindestens PHP 5.4+. Auch dies ungetestet)
$q = get_queried_object();
$args = [
'post_type' => 'sectors',
'tax_query' => [
[
'taxonomy' => $q->taxonomy,
'terms' => $q->term_id,
'include_children' => false // Exclude child terms
],
[
'taxonomy' => 'post_tag',
'field' => 'slug',
'terms' => 'sector1', //I believe this is the slug
'operator' => 'NOT_IN'
],
],
];
Verwenden Sie für ältere PHP-Versionen Folgendes
$q = get_queried_object();
$args = array(
'post_type' => 'sectors',
'tax_query' => array(
array(
'taxonomy' => $q->taxonomy,
'terms' => $q->term_id,
'include_children' => false // Exclude child terms
),
array(
'taxonomy' => 'post_tag',
'field' => 'slug',
'terms' => 'sector1', //I believe this is the slug
'operator' => 'NOT_IN'
),
),
);
Beachten Sie nur, dass Sie ein Array von Tags an die übergeben können terms
Parameter wie dieser
'terms' => array( 'sector1', 'sector2', 'etc' ),
oder kurze Array-Syntax
'terms' => ['sector1', 'sector2', 'etc'],
BEARBEITEN 3
Da dies Ihre Hauptabfrage ist, müssen Sie einige Änderungen vornehmen. Wie gesagt, entfernen Sie die benutzerdefinierte Abfrage. Ihre Hauptschleife sollte in etwa so aussehen
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
<a href="https://stackoverflow.com/questions/30256167/<?php echo get_permalink(); ?>">
<?php echo "<div class="col-md-6 col-sm-6 col-xs-12" style="margin-bottom:30px;">"; ?>
<div class="row mobilemargin">
<div class="categorytiletext2">
<div class="col-md-6 col-sm-12 col-xs-12 nopr"><?php echo get_the_post_thumbnail( $page->ID, 'categoryimage', array('class' => 'hovereffect newimgheight')); ?> </div>
<div class="col-md-6 col-sm-12 col-xs-12 mobilewhite">
<div class="testdiv">
<h5 class="captext"><?php the_title(); ?></h5>
<?php $trimexcerpt = get_the_excerpt();
$shortexcerpt = wp_trim_words( $trimexcerpt, $num_words = 10, $more="… " );
echo '<a href="' . get_permalink() . '"><p>' . $shortexcerpt . '</p></a>';
?>
</div>
</div>
</div>
</div>
<?php echo "</div>"; ?>
</a>
<!-- If there is no posts, display an error message -->
<?php endwhile;
else: ?>
<p><?php _e('Sorry, no posts matched your criteria.'); ?></p>
<?php endif; ?>
<!-- If there is no posts, display an error message -->
Sie können jetzt verwenden pre_get_posts
um das gewünschte Tag von Ihren Taxonomieseiten zu entfernen. Gehen Sie in Ihrer functions.php wie folgt vor: (Benötigt PHP 5.3+ und ist ebenfalls ungetestet)
add_action( 'pre_get_posts', function ( $q )
{
if ( !is_admin() && $q->is_main_query() && $q->is_tax() ) {
$q->set( 'tag__not_in', array( 145 ) );
}
});
Für ältere Versionen verwenden
add_action( 'pre_get_posts', 'so30256167_remove_tags' );
function so30256167_remove_tags( $q )
{
if ( !is_admin() && $q->is_main_query() && $q->is_tax() ) {
$q->set( 'tag__not_in', array( 145 ) );
}
}
Denken Sie nur daran, sich zu ändern 145
zu Ihrem genauen Tag Ich würde oder ein Array von Tagsids
BEARBEITEN 4
Wenn Sie die Tag-IDs nicht haben, können Sie verwenden get_term_by()
um die Tag-ID aus dem Tag-Slug zu erhalten. So etwas wird tun: (Benötigt PHP 5.3+ und ist ebenfalls ungetestet)
add_action( 'pre_get_posts', function ( $q )
{
if ( !is_admin() && $q->is_main_query() && $q->is_tax() ) {
$tag_object = get_term_by( 'slug', 'sector1', 'post_tag' );
$tagID = $tag_object->term_id;
$q->set( 'tag__not_in', array( $tagID ) );
}
});
Für ältere Versionen verwenden
add_action( 'pre_get_posts', 'so30256167_remove_tags' );
function so30256167_remove_tags( $q )
{
if ( !is_admin() && $q->is_main_query() && $q->is_tax() ) {
$tag_object = get_term_by( 'slug', 'sector1', 'post_tag' );
$tagID = $tag_object->term_id;
$q->set( 'tag__not_in', array( $tagID ) );
}
}
Wenn Sie über ein Array von Tag-Slugs verfügen, können Sie Folgendes ersetzen
$tag_object = get_term_by( 'slug', 'sector1', 'post_tag' );
$tagID = $tag_object->term_id;
$q->set( 'tag__not_in', array( $tagID ) );/*
mit
$tag_array = array( 'slug1', 'slug2', 'slug3' );
foreach ( $tag_array as $tag ) {
$tag_object = get_term_by( 'slug', $tag, 'post_tag' );
$tagids[] = $tag_object->term_id;
}
$q->set( 'tag__not_in', $tagids );
Denken Sie nur daran, die Schnecken entsprechend zu ändern
BEARBEITEN 5
Ihren endgültigen Code in der functions.php mit pre_get_posts
sollte sein
add_action( 'pre_get_posts', 'so30256167_remove_tags' );
function so30256167_remove_tags( $q )
{
if ( !is_admin() && $q->is_main_query() && $q->is_tax() ) {
$tag_array = array( 'sector1', 'sector2', 'sector3', 'sector4' );
foreach ( $tag_array as $tag ) {
$tag_object = get_term_by( 'slug', $tag, 'post_tag' );
$tagids[] = $tag_object->term_id;
}
$q->set( 'tag__not_in', $tagids );
}
}
Hat irgendjemand ne Idee????
– Benutzer2209033
17. Mai 2015 um 14:21 Uhr