Actualités WEB et WordPress, thèmes, plugins. Ici, nous partageons des conseils et les meilleures solutions de sites Web.

Ajouter un lien personnalisé à l’écran de toutes les publications en fonction des métadonnées de la publication

17

TL; DR: Cet article décrit le code nécessaire pour ajouter un lien personnalisé sur l’ écran Tous les messages qui utilise un élément personnalisé de métadonnées de publication.

Remarque: Il y a quelques mois, j’ai écrit un article expliquant comment ajouter une vue personnalisée à l’écran Tous les messages. Cet article n’est pas tous ensemble le même, mais pas tous ensemble différents. Considérez-le comme une mise en œuvre plus détaillée et peut-être plus pratique du concept.


Supposons que vous ayez un type de publication standard ou un type de publication personnalisé et que vous allez simplement filtrer par un titre que vous définissez à l’aide d’un mécanisme qui vous permet d’enregistrer des données dans le post_metadatatableau.

Par exemple, disons que vous avez un article et qu’il s’agit d’un élément de métadonnées avec :

  • a meta_keyavec la valeur dearticle_attribute
  • a meta_valueavec la valeur deheadline

Et vous souhaitez utiliser ces informations pour ajouter un nouveau lien Titres qui filtre automatiquement tout sauf les articles avec ces métadonnées.

Voici comment procéder.

Lien personnalisé sur l’écran de tous les messages

Avant de commencer, il convient de noter qu’il existe deux façons de résoudre ce problème :

  • Nous pourrions d’abord ajouter le lien en haut de la page Tous les messages, puis ajouter la fonctionnalité de filtrage des données en second lieu,
  • Ou nous pouvons le faire dans l’autre sens en ajoutant d’abord la logique principale, puis en ajoutant le lien de la page Tous les messages .

Je vais choisir de commencer par la deuxième option. Il n’y a aucune raison pour que cela soit fait de cette façon. C’est ma préférence.


Tout d’abord, je dois me connecter au [pre_get_posts](https://developer.wordpress.org/reference/hooks/pre_get_posts/)crochet fourni par WordPress. Je ne vais pas utiliser de classes d’espace de noms ou de fonctions préfixées dans cet exemple (étant donné que j’ai suffisamment couvert ce contenu sur ce site), mais j’aurai un plug-in de démonstration pour ce lien au bas de l’article.

Quoi qu’il en soit, je commencerai par ajouter une fonction anonyme attachée au crochet susmentionné :

add_action(
  'pre_get_posts',
  function (WP_Query $query) {

  }
);

Notez que la fonction anonyme accepte un seul argument qui est une référence à l’instance actuelle de WP_Queryqui s’exécute sur la page. Si vous n’êtes pas familier avec cette classe, je vous recommande de lire l’un de ces articles ou la page des ressources pour les développeurs.

Dans la fonction, je dois vérifier la présence de a meta_valuedans la chaîne de requête. C’est facile à faire grâce à la [filter_input](https://www.php.net/manual/en/function.filter-input.php)fonction fournie par PHP.

add_action(
  'pre_get_posts',
  function (WP_Query $query) {
    $meta_value = 'headline';

    if (filter_input( INPUT_GET, 'meta_value') === $meta_value) {
      $query->set( 'meta_key', 'article_attribute' );
      $query->set( 'meta_value', $meta_value );
    }
  }
);

Ce crochet cherchera à voir si la headlinevaleur est clé pour la meta_valueclé dans la chaîne de requête. Si c’est le cas, il ajoute ensuite un meta_keyet meta_valueà l’instance WP_Queryqui demandera à WordPress de récupérer tous les messages avec uniquement ces métadonnées.


Après cela, je dois ajouter un lien en haut de la page Tous les messages pour déclencher cette fonctionnalité. Pour ce faire, je vais tirer parti du [views_edit-posts](https://tommcfarlin.com/add-a-custom-view/)crochet. Cette fonction acceptera un tableau d’ancres qui seront affichées en haut de la page.

Je me réfère à ceux-ci comme $viewsc’est ce que la fonction acceptera quand je le supprimerai:

add_action(
  'views_edit-post',
  function (array $views) {

    return $views;
  }
);

Notez qu’il est important de renvoyer le tableau à WordPress afin qu’il sache quoi rendre même si aucune modification n’est apportée.

Tout d’abord, je dois déterminer si je suis actuellement sur la page personnalisée. Si tel est le cas, je dois ajouter les attributs appropriés à l’ancre ajoutée en haut de la page :


$attributes = 'class=""';
if (filter_input(INPUT_GET, 'meta_value') === 'headline') {
  $attributes ='class="current aria-current="page"';
}

Après cela, je dois ajouter la vue Titres à la page. Cela nécessitera l’utilisation de plusieurs fonctions :

  • [array_push](https://www.php.net/manual/en/function.array-push.php)pour ajouter un nouveau lien à la liste des$views
  • [sprintf](https://www.php.net/manual/en/function.sprintf.php)pour ajouter en toute sécurité une nouvelle chaîne
  • [add_query_arg](https://developer.wordpress.org/reference/functions/add_query_arg/)pour ajouter un ensemble d’arguments de requête personnalisés à la page actuelle.

La prochaine section de code ressemblera à ceci :


array_push(
  $views,
  sprintf(
    '<a href="%1$s" %2$s>%3$s 
      <span class="count">(%4$s)</span>
     </a>
    ',
    add_query_arg([
      'post_type'   => 'post',
      'post_status' => 'all',
      'meta_value'  => 'headline',
    ], 'edit.php'),
    $attributes
    __('Headlines'),
    count(  );
);

Mais je n’ai pas encore fini. Notez spécifiquement que je fais un appel à [count](https://www.php.net/manual/en/function.count.php)à la fin de la fonction. C’est pour que je puisse afficher correctement le nombre de messages qui ont cet attribut.

Je vais écrire deux fonctions d’assistance pour cela, puis je reviendrai à l’ sizeofappel.


Voici une fonction d’assistance pour trouver le nombre de résultats qui ont le spécifié meta_keyet meta_valueque nous avons pour ce type de publication. Notez que j’utilise [$wpdb](https://developer.wordpress.org/reference/classes/wpdb/)pour effectuer un appel direct à la base de données et que j’utilise spécifiquement [prepare](https://developer.wordpress.org/reference%2Fclasses%2Fwpdb%2Fprepare%2F/)pour m’assurer de le faire en toute sécurité.

function get_headline_results(): array {
  global $wpdb;
  return $wpdb->get_results( 
    $wpdb->prepare(
      "
      SELECT post_id FROM $wpdb->postmeta
      WHERE meta_key = %s AND meta_value = %s
      ",
      'article_attribute',
      'headline'
    ),
    ARRAY_A
  );
}

Notez qu’il renvoie tous les résultats (pas seulement le nombre) car cette valeur sera momentanément passée à une autre fonction.

À ce stade, nous pourrions nous arrêter et simplement regarder le contenu renvoyé par la requête, mais si nous ne nous préoccupons que du posttype de publication, nous devrons en tenir compte. Voici une façon de procéder :

function filter_posts_from_pages( array $results ): array {
  $post_ids = array();

  foreach ($results as $result) {
    if ('post' === get_post_type( $result['post_type'])) {
      $post_ids[] = $result['post_id'];
    }
  }

  return $post_ids;
}

Avec cela, nous pouvons renvoyer cette valeur à la countfonction ci-dessus.


La version finale du bloc que nous avons commencé ci-dessus devrait ressembler à ceci :


array_push(
  $views,
  sprintf(
    '<a href="%1$s" %2$s>%3$s <span class="count">(%4$s)</span></a>',
    add_query_arg(
      array(
        'post_type'   => 'post',
        'post_status' => 'all',
        'meta_value'  => 'headlines', 
      ),
      'edit.php'
    ),
    $attributes,
    __( 'Headlines' ),
    count(
      filter_posts_from_pages( get_headline_results()) )) );

Ce qui signifie que la version complète de la fonction pour ajouter un nouveau titre ressemble à ceci :

add_action(
  'views_edit-post',
  function (array $views) {

    $attributes = 'class=""';
    if (filter_input( INPUT_GET, 'meta_value') === 'headline') {
      $attributes = 'class="current aria-current="page"';
    }

    array_push(
      $views,
      sprintf(
        '<a href="%1$s" %2$s>%3$s <span class="count">(%4$s)</span></a>',
        add_query_arg(
          array(
            'post_type'   => 'post',
            'post_status' => 'all',
            'meta_value'  => 'headline', 
          ),
          'edit.php'
        ),
        $attributes,
        __( 'Headlines' ),
        count(
          filter_posts_from_pages( get_headline_results()) )) );

    return $views;
  }
);

Et, comme mentionné dès le départ, ce plugin n’est pas nommé ou organisé d’une manière que j’écris normalement du code. Au lieu de cela, il est destiné à démontrer un moyen de réaliser quelque chose rapidement – une sorte de prototype.

Donc, si vous souhaitez voir quelque chose comme ça en action, vous pouvez consulter le référentiel sur GitHub. Notez qu’il s’agit de la branche develop pour le moment. N’oubliez pas de consulter le [README](https://github.com/tommcfarlin/custom-metadata-filter/blob/develop/README.md)car il donnera des instructions sur la façon d’ajouter des données à la base de données pour les publications afin que l’ ancre Headlines fonctionne réellement plutôt que d’afficher inconditionnellement une valeur nulle.

Source d’enregistrement: tommcfarlin.com

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More