web-dev-qa-db-fra.com

Meilleur moyen d'ajouter un lien interne dans un widget

Je cherche un moyen de transformer un morceau de code statique en un widget à afficher dans différentes barres latérales contenant un simple lien interne.

Le code de base est:

<div class="my-link-box">
<a href="<?php echo get_page_link(90); ?>">My link text</a>
</div>

L’objectif principal est de rendre le futur pérenne, quelle que soit l’URL du site, il devrait fonctionner sans recherche et remplacement ni autre intervention manuelle.

Je voudrais éviter:

  • php dans le widget
  • lien codé en dur

Peut-être un shortcode spécifique au widget? Toute aide est très appréciée :)

1
molokom

L'ID de page peut varier selon les installations et ne peut pas être modifié. Il est donc possible d'utiliser get_page_by_path, car le slug de page peut être facilement modifié:

<div class="my-link-box">
<?php $page = get_page_by_path('my-page'); ?>
<a href="<?php echo get_permalink($page); ?>"><?php echo $page->post_title; ?></a>
</div>

Cependant, ce n'est pas une bonne solution aussi.

Une fois que vous écrivez un widget personnalisé, vous pouvez configurer l'option permettant de sélectionner la page dont vous souhaitez afficher le lien. par exemple.:

class MyPageLinkWidget extends WP_Widget {

  function __construct(){
    parent::__construct( false, 'Page Link Widget' );
  }

  function widget( $args, $instance ){
    if ( ! isset($instance['wpage']) || (int) $instance['wpage'] <= 0 ) return;
    $page = get_post( $instance['wpage'] );
    echo $args['before_widget'];
    echo '<div class="my-link-box">';
    if ( isset($instance['title']) ) {
       $title = apply_filters( 'widget_title', $instance['title'] );
       if ( $title ) echo $args['before_title'] . $title . $args['after_title'];
    }
    echo '<a href="' . get_permalink( $page ) .'">' . $page->post_title . '</a>';
    echo '</div>';
    echo $args['after_widget'];
  }

  function update( $new_instance, $old_instance ){
    $instance = $old_instance;
    $instance['title'] = strip_tags( $new_instance['title'] );
    if ( isset( $new_instance['wpage'] ) && (int) $new_instance['wpage'] > 0 ) {
      $instance['wpage'] = $new_instance['wpage'];
    }
    return $instance;
  }

  function form( $instance ){
    $default = array( 'wpage'=>'-1', 'title' => '' );
    $instance = wp_parse_args( (array) $instance, $default );
    $args = array(
      'name' => $this->get_field_name('wpage'),
      'show_option_none' => 'None',
      'option_none_value' => '-1',
      'selected' => $instance['wpage']
    );
    echo '<p><label>Title:</label>';
    echo '<input class="widefat" name="' . $this->get_field_name('title') . '" type="text" value="' . $instance['title'] . '" /></p>';
    wp_dropdown_pages( $args );
  }

}

Toutefois, si votre widget ne contient que des liens vers des pages, envisagez de créer un menu personnalisé et utilisez le widget "Menu personnalisé".

3
gmazzap