web-dev-qa-db-fra.com

Insertion automatique Plus de tags dans tous les messages

J'ai un thème pour mon site mobile qui requiert la balise <!--more--> dans mes publications pour qu'elle puisse afficher un extrait du contenu de celle-ci.

J'ai déjà plus de 2 000 messages et cela va prendre du temps à ajouter le tag dans tous mes messages. Je ne veux pas utiliser de plugin, car j'en ai utilisé un qui n'était pas stable du tout.

J'ai juste besoin d'un extrait que je peux brancher dans les fichiers de mon thème qui ajoutera le plus de balises après un nombre spécifique de mots ou de mots dans tous mes posts, et dans chaque post que je publie après cela.

1
Feyisayo Sonubi

Si vous souhaitez contrôler le nombre de chaînes, vous pouvez le faire comme suit.

Placez le code ci-dessous dans le fichier functions.php du thème actif: -

function custom_excerpt_length( $length ) {
    return 20; // You can change the number here as per your need.
}
add_filter( 'excerpt_length', 'custom_excerpt_length', 999 );

Par défaut, la longueur de l'extrait est définie sur 55 mots. Pour modifier la longueur de l'extrait en 20 mots à l'aide du filtre excerpt_length, ajoutez le code ci-dessus au fichier functions.php de votre thème:

Pour plus de détails, consultez Codex

1
Maruti Mohanty

La baliseRead More(<!--more-->) est traitée par get_the_content() dans wp-includes/post-template.php. Il n’exécute aucun filtre pouvant être accroché sur son entrée de contenu; cependant, cela provient du $pages global qui peut être modifié au moment de sa configuration en reliant l'action the_post.

La fonction suivante insérera automatiquement une balise <!--more--> dans le premier espace après 280 caractères (en ignorant les balises HTML et en comptant les séquences de blancs comme un seul caractère), s’il n’en existe pas déjà une:

\add_action(
  'the_post',
  function($post, $query) {
    global $pages;
    // Matches an HTML entity, block of whitespace, or single character:
    static $rxChar = '(?:&#?+\\w++;|\\s++|[^<])';
    // Matches zero or more HTML tags:
    static $rxTags = '(?:<[^>]*+>)*+';
    foreach ($pages as $i => $page) {
      if (\strpos($page, '<!--more') === false) {
        $page = \preg_replace(
          // At least 280 characters, from the start, followed by a space
          // (catastrophic failure with general repetition quantifier mitigated
          // against by splitting into two multiplicative repetitions):
          "/^(?:(?:$rxTags$rxChar){10}+){28}+" . $rxTags
            . "(?:$rxChar$rxTags)*?(?=\\s)/u",
          '$0<!--more-->',
          $page,
          1
        );
        if ($page !== null) {
          $pages[$i] = $page;
        } else {
          trigger_error(
            "Regex failure inserting 'Read More' tag into `$pages[$i]`."
          );
        }
      }
    }
  },
  10, 2
);

Cela devrait être assez explicite, mais j’ajouterai quelques notes sur la regex:

  • Le modificateur u (UTF-8) garantit que les caractères multi-octets ne comptent que pour un.
  • Le quantificateur + (possessif)/- optimise massivement les performances et l’empreinte mémoire (lorsque le jeton ne peut consommer aucun des jetons suivants). Cependant, cela ne semble pas faire beaucoup de différence pour atténuer les échecs lorsqu’il est appliqué au quantificateur de répétition général, ce qui a donc été divisé en répétitions de répétitions. Et néanmoins, en cas d'échec, le contenu restera inchangé.
  • Le quantificateur ? (lazy) garantit que le premier espace après 280 caractères est arrêté, pas le dernier.

(Je sais que cette question a été posée il y a plus de 4 ans, mais on n'y avait pas répondu. Je l'ai trouvée à la recherche d'une solution identique à celle que je n'avais pas trouvée ailleurs.)

0
Jake