it-swarm.com.de

Der Shortcode eines Widgets wird in ein unerwünschtes <p> -Element eingeschlossen

Ich verwende Black Studio TinyMCE Widget als Rich-Text-Editor-Widget. In einer Seitenleiste habe ich das TinyMCE-Widget mit einem [testimonial]-Shortcode und etwas Inhalt danach eingefügt.

Zum Beispiel:

[testimonial]

Read more client testimonials (as a link)

Wenn ich zur HTML-Registerkarte dieses Widgets wechsle, habe ich Folgendes:

<p>[testimonial]</p>
<p><a title="Testimonials" href="http://mm.dev/testimonials/">Read more client testimonials</a></p>

Der Shorcode zeigt einfach einen zufälligen TestimonialCPT-Beitrag an:

add_shortcode("testimonial", "dlma_testimonial_shortcode");
function dlma_testimonial_shortcode($atts, $content = null){
    $args = array(
        'post_type' => 'testimonial',
        'post_status' => 'publish',
        'posts_per_page' => '1',
        'orderby' => 'Rand'
    );
    $testimonial = new WP_Query($args);

    if($testimonial){
        return apply_filters('the_content', $testimonial->posts[0]->post_content);
    }
    return "";
}

Beim Anzeigen einer Seite werden jedoch <p> -Elemente eingefügt:
Bearbeitet dank Tom J Nowell

<div class="textwidget">
  <p>
    <blockquote>
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis vestibulum velit convallis sem pulvinar vitae lobortis metus varius.” <em>Person name, Person job</em></p>
    </blockquote>
  </p>
  <p>
    <a href="http://mysite.com/testimonials/" title="Testimonials">Read more client testimonials</a>
  </p>
</div>

Der [testimonial]-Shortcode wurde korrekt erweitert, da er ursprünglich in das <p>-Element des Widgets eingebunden war und immer noch darin eingebunden zu sein scheint. Ich habe versucht, das Element <p> aus der HTML-Registerkarte des Widgets zu löschen. Wenn Sie jedoch auf die Schaltfläche Speichern klicken, wird das Element <p> erneut eingefügt.

Ich habe versucht, unerwünschte <p> -Elemente zu entfernen, die den Shortcode wie folgt mit dem the_content-Filter umschließen:

remove_filter( 'the_content', 'wpautop' );
add_filter( 'the_content', 'wpautop' , 12);

Das hat nicht geklappt Ich vermute, ich habe den Fluss falsch verstanden, den Inhalt eines Widgets mit einem darin enthaltenen Shortcode zu verarbeiten. Ich bin jetzt sehr verwirrt. Wie kann ich unerwünschte <p> -Elemente entfernen, die Shortcodes umschließen?

Ich würde mich über jede Hilfe sehr freuen!

Danke vielmals.

2
dashaluna

Tatsächlich gibt es mehrere Möglichkeiten, mit dem Wordpress-Editor umzugehen, der Shortcodes in <p>-Tags einfügt.

Dieser Code zeigt wahrscheinlich den einfachsten Weg, dies zu tun ... nur eine einfache und kurze Funktion, die Sie in Ihre Datei functions.php einfügen müssen. Sobald Sie dies getan haben, werden keine Tags mehr um Ihre Shortcodes herum angezeigt, die sich in einer eigenen Zeile befinden!

function wpex_clean_shortcodes($content){   
$array = array (
    '<p>[' => '[', 
    ']</p>' => ']', 
    ']<br />' => ']'
);
$content = strtr($content, $array);
return $content;
}
add_filter('the_content', 'wpex_clean_shortcodes');

Quelle: http://www.wpexplorer.com/snippet/clean-wordpress-shortcodes

Hoffe das hilft jemandem!

10
Trevor

Eine blockquote ist ein Blockelement und sollte nicht in ein <p> -Tag eingefügt werden. Sie sehen, dass Ihr Browser-DOM versucht, das ungültige HTML-Markup zu kompensieren. Wenn Sie sich den generierten Roh-Quellcode ansehen, werden Sie diese verirrten Absatz-Tags nicht finden

Entfernen Sie die <p>-Umbruch-Tags und stellen Sie sicher, dass alle Inhalte, die in ein <p>-Tag eingebunden werden müssen, im Shortcode enthalten sind.

https://stackoverflow.com/questions/3428828/p-tag-is-a-block-level-element-in-xhtml

Die allgemeine Regel lautet, dass ein <p> -Element ein Blockelement ist, es jedoch niemals Blockelemente, sondern nur Inline-Elemente enthalten sollte.

z.B.:

  • Ein p Element kann enthalten:
    • span
    • b
    • strong
    • usw
  • Ein p -Element darf nicht enthalten:
    • div
    • blockquote
    • ul
    • ol
    • h1
    • usw
1
Tom J Nowell

Ich würde dies vorschlagen, wodurch bestimmte Shortcodes auf Blockebene außerhalb von p-Elementen verschoben werden, ohne die anderen zu beeinflussen, die möglicherweise als Inline-Codes gedacht sind:

function my_fix_shortcodes($content){  
  if (strpos($content, '<p>') !== false) {
    /* Move 'block level' shortcode tags outside <p> elements by surrounding with </p>...<p>
       If they have content, this will be put inside a new <p>
       - you could use a final regex to remove this if needed... */
    $block_level_shortcodes = array(
      'testimonial',
      'another_shortcode'
    );
    $regex_shortcode = '(' . implode('|', $block_level_shortcodes) . ')';
    // Match opening/standalone or closing shortcode tags
    $regex = '/(\[' . $regex_shortcode . '[^\]]*\]|\[\/' . $regex_shortcode . '\])/';
    $regex_count = 0;
    $content = preg_replace($regex, '</p>$1<p>', $content, -1, $regex_count);
    if ($regex_count > 0) {
      /* Remove <br/>s at start or end of <p> which might now be present,
         then any empty <p>s which quite probably are */
      $content = preg_replace(
        array('/<p>\s*<br *\/>/s', '/<br *\/>\s*<\/p>/s', '/<p>\s*<\/p>/s'),
        array('<p>', '</p>', ''),
        $content
      );                    
    }
  }
  return $content;
}
add_filter('the_content', 'my_fix_shortcodes');

Beachten Sie auch, dass anscheinend ein Versuch fehlgeschlagen ist, dieses Problem in WordPress [4.00] selbst zu beheben, sodass Ihren Shortcode-Handlern möglicherweise $ content übergeben wird, dem </ p> vorangestellt und mit <p> postfixiert ist erkennen und entfernen müssen.

Update: In WordPress selbst scheint etwas kaputt zu sein (in Bezug auf das sporadische Hinzufügen von <p> und </ p> außerhalb des einfachen anfänglichen wpautop, wenn Shortcodes beteiligt sind, wie oben erwähnt [aber diese sporadischen Elemente werden nicht weitergegeben an Ihren Handler]), was bedeutet, dass diese Lösung möglicherweise nicht immer funktioniert, obwohl sie Folgendes sollte: /

0
Jake

Dies ist seit Jahren ein bekanntes Problem. Bitte werfen Sie einen Blick auf Wordpress Ticket .

Wie andere vielleicht schon erwähnt haben, gibt es ein Plugin, um dieses Problem zu beheben. Es heißt " Shortcode Empty Paragraph Fix ". Es ist nicht die beste Lösung, aber nicht so schlimm.

Ich bin kein Fan davon, meiner wp-Installation viel Schwung zu verleihen - also habe ich den Shortcode in div ohne Klasse verpackt und das Problem behoben.

<div> [woocommerce_cart] </div>

Ich hoffe, dass das Problem in den nächsten Jahren behoben wird;), damit ich meine divs entfernen kann - meiner Meinung nach ein sicherer Weg, da manchmal zusätzliche Funktionen in der funcitons.php später Probleme verursachen können.

0
evavienna