Une loop qui redirige vers un site extérieur

L’avantage de wordpress réside beaucoup dans son langage , ses template_tags ou fonctions prédéfinies qui permettent de coder plus rapidement.Les get_header(), get_footer(), et surtout la loop qui permet de ramener des éléments très simplement.Seulement ca se complique si on veut intervenir sur l’aspect ou le comportement des éléments appelés dynamiquement par la loop.

Pour dresser une liste contenant des données issues de la base (articles, images etc), plutot que de faire une liste entière ul >li  avec un nombre incalculable de li, la loop nous permet de coder juste un  > li  et à l’intérieur d’y dessiner l’aspect de l’article, qui se répétera pour tous les articles appelés.

Seulement voila, on veut par exemple que chaque lien contenu dans chaque li, renvoie vers une adresse externe au site.

Modifier la boucle des articles

Partons d’un exemple précis: une page liste nos différents articles, représentés juste par leur thumbnail :La boucle serait la suivante

<?php while ( have_posts() ) : the_post(); ?>
<li>
<a href="<?php the_permalink();?>" title="<?php the_title();?>" ><?php the_post_thumbnail('thumbnail'); ?><span><strong><?php the_title(); ?></strong></span></a>

</li>
<?php endwhile; ?>
</ul>

Si on se situe dans une catégorie particulière, ou une taxonomy particulière, on choisit le bon tag conditionnel:

$args = array( 'post_status'=>"publish", 'post_type'=>"votreposttype", 'tax_query'=> array ( array('taxonomy'=>'votre taxo', 'field'=>'slug', 'terms'=>get_queried_object()->slug, 'include_children' => false)), 'orderby'=>"post_date", 'order' => 'ASC', 'posts_per_page' => -1);
$wp_query = new WP_Query( $args );
?>
<ul>
<?php while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
<li>
<?php
<a href="<?php the_permalink();?>" title="<?php the_title();?>" ><?php the_post_thumbnail('thumbnail'); ?><span><strong><?php the_title(); ?></strong> </span></a>
<?php endif;?>
</li>
<?php endwhile; ?>

et enfin pour rediriger les internautes vers un site exterieur, à partir des thumbnails, on pose une condition sur l’url, pour dire: « si la fin de l’url comporte tel ou tel terme alors fais ceci ou cela »

  <?php
$args = array( 'post_status'=>"publish", 'post_type'=>"votreposttype", 'tax_query'=> array ( array('taxonomy'=>'votretaxo', 'field'=>'slug', 'terms'=>get_queried_object()->slug, 'include_children' => false)), 'orderby'=>"post_date", 'order' => 'ASC', 'posts_per_page' => -1);
$wp_query = new WP_Query( $args );
?>
<ul>
<?php while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
<li>
<?php
$url = 'http://' . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
if (strpos($url,'luxe') !== false): ?>
<a target="_blank" href="http://www.site.com/fr/blabla/luxe/<?php echo $post->post_name;?>" title="<?php the_title();?>" ><?php the_post_thumbnail('thumbnail'); ?><span><strong><?php the_title(); ?></strong> <?php echo get_field('sous-titre'); ?></span></a>
<?php elseif(strpos($url,'sportlifestyle') !== false) :?>
<a target="_blank" href="http://www.site.com/fr/marques/sport-lifestyle/<?php echo $post->post_name;?>" title="<?php the_title();?>" ><?php the_post_thumbnail('thumbnail'); ?><span><strong><?php the_title(); ?></strong> <?php echo get_field('sous-titre'); ?></span></a>
<?php else :?>
<a href="<?php the_permalink();?>" title="<?php the_title();?>" ><?php the_post_thumbnail('thumbnail'); ?><span><strong><?php the_title(); ?></strong> <?php echo get_field('sous-titre'); ?></span></a>
<?php endif;?>
</li>
<?php endwhile; ?>

Dans l’exemple précédent, je veux rediriger les internautes vers un site extérieur en fonction de la sous-catégorie ou il se trouve.Si l’url de la page se termine par « luxe », je redirige vers un site extérieur.Pareil si l’url de la page se termine par ‘sportlifestyle ».Enfin, si la fin de l’url ne se termine par aucun des deux mots, je choisi ici de rester sur le site et derediriger vers la page liée au thumbnail avec ‘the_permalink()’.

Créer une fonction pour rediriger l’article

Le site wp beginner propose une autre solution, la voici :

function print_post_title() {
global $post;
$thePostID = $post->ID;
$post_id = get_post($thePostID);
$title = $post_id->post_title;
$perm = get_permalink($post_id);
$post_keys = array(); $post_val = array();
$post_keys = get_post_custom_keys($thePostID);

if (!empty($post_keys)) {
foreach ($post_keys as $pkey) {
if ($pkey=='external_url') {
$post_val = get_post_custom_values($pkey);
}
}
if (empty($post_val)) {
$link = $perm;
} else {
$link = $post_val[0];
}
} else {
$link = $perm;
}
echo '<h2><a href="'.$link.'" rel="bookmark" title="'.$title.'">'.$title.'</a></h2>';
}

ce code, à placer dans le fichier functions.php, vérifie s’il y a un champ additionnel renseigné dans l’article.Si un url a été ajouté dans un champ additionnel nommé ‘external_url’ alors au clic sur le titre on redirge vers l’url en question.

Pour voir apparaitre les champs additionnel dans une page d’article, on déroule le petit menu « screen option  » tout en haut de l’écran, et on coche la case « custom field » ou champ additionnel.On crée ensuite un champ additionnel que l’on nomme  ‘external_url’ et on ajoute son url spécifique.

Pour finir, dans chaque page qui affiche des articles (category.php, archive.php, index.php) au lieu du classique the_title() , on utilise la nouvelle fonction créee:

<?php print_post_title() ?>

Créer une metabox

Autre solution, on va cette fois créer nous meme le champ additionnel, dans lequel on insérera notre url spécifique.

Voici d’abord le code pour la création d’une metabox, à placer dans le fichier functions.php




add_action('add_meta_boxes','initialisation_metaboxes');
function initialisation_metaboxes(){
add_meta_box('link', 'Mon lien', 'link_function', 'service', 'side', 'high');
}

function link_function($post){
// on récupère la valeur actuelle pour la mettre dans le champ
$val = get_post_meta($post->ID,'_mon_lien',true);
echo '<label for="mon_lien">Mon lien : </label>';
echo '<input id="mon_lien" type="text" name="mon_lien" value="'.$val.'" />';
}

add_action('save_post','save_metaboxes');
function save_metaboxes($post_ID){
// si la metabox est définie, on sauvegarde sa valeur
if(isset($_POST['mon_lien'])){
update_post_meta($post_ID,'_mon_lien', esc_html($_POST['mon_lien']));
}
}

Cela ajoute une petite boite sur le cote dans la page d’édition de l’article

monlien

Dans le ou les fichiers qui nous interessent, cette fois on va rajouter un lien à l’image à la une (thumbnail) avec comme condition: s’il y a un url de renseigné dans notre meta box, renvoie moi vers cet url, autrement, renvoie moi sur l’article en question

<?php if ( get_post_meta($post->ID, '_mon_lien',true) ) : ?>
<?php $val = get_post_meta($post->ID,'_mon_lien',true);?>
<a href="<?php echo $val ;?>" target="_blank"><?php the_post_thumbnail('thumbnail' ); ?></a>
<?php else : ?>
<a href="<?php the_permalink() ;?>" target="_blank"><?php the_post_thumbnail('thumbnail' ); ?></a>
<?php endif;?>