it-swarm.com.de

ändern Sie href programmatisch in onclick = window.open

Weiß jemand, wie man den Link programmatisch ändert von:

<a href="some_url">click</a>

zu:

<a onclick="window.open('some_url','_blank', 'location=no')">click</a>

damit alle im wordpress visual editor erstellten links über inappbrowser in einer cordova app geöffnet werden.

dies ist die nächste, die ich bekommen kann, aber immer noch nicht funktioniert. Die Variable '%link%' ändert sich nicht in die tatsächliche Link-URL:

add_filter('the_content', 'changeToOnclick');
function changeToOnclick($content) {
    return preg_replace('/<a [^>]*>/', "<a onclick=\"window.open('%link%', '_blank', 'location=no')\">", $content);
}

jede Hilfe wird geschätzt :)

2
yanuar

Das Parsen von HTML mit regulären Ausdrücken ist nicht ideal. Eine bessere Alternative ist die Verwendung von DOMDocument und DOMXpath;

Dieser Code verwendet DOMDocument und DOMXpath, um den HTML-Code zu analysieren und zu ändern, ohne sich auf reguläre Ausdrücke zu verlassen. Zu jedem Link im Inhalt wird das Attribut onclick zusammen mit dem entsprechenden Code für window.open() hinzugefügt, wobei die URL aus dem Wert des Attributs href abgerufen wird. Das Attribut href wird dann aus dem Link entfernt.

add_filter( 'the_content', 'wpse_cordova_links', 10, 1 );
function wpse_cordova_links( $content ) {
    // Create an instance of DOMDocument.
    $dom = new \DOMDocument();

    // Suppress errors due to malformed HTML.
    // See http://stackoverflow.com/a/17559716/3059883
    $libxml_previous_state = libxml_use_internal_errors( true );

    // Populate $dom with $content, making sure to handle UTF-8, otherwise
    // problems will occur with UTF-8 characters.
    $dom->loadHTML( mb_convert_encoding( $content, 'HTML-ENTITIES', 'UTF-8' ) );

    // Restore previous state of libxml_use_internal_errors() now that we're done.
    // Again, see http://stackoverflow.com/a/17559716/3059883
    libxml_use_internal_errors( $libxml_previous_state );

    // Create an instance of DOMXpath.
    $xpath = new \DOMXpath( $dom );

    // Query all links within our content.
    $links = $xpath->query( '//a' );

    // Iterate over the $links.
    foreach ( $links as $link ) {
        if ( $link->hasAttributes() ) {
            // Get the value of the href attribute
            $link_href = $link->getAttribute( 'href' );

            // Create an onlick attribute and set the value
            $link_onclick = $dom->createAttribute( 'onclick' );
            $link_onclick->value = "window.open( '" . $link_href . "', '_blank', 'location=no' );";
            $link->appendChild( $link_onclick );

            // Remove the href attribute
            $link->removeAttribute( 'href' );
        }
    }

    // Save the updated HTML
    $content = $dom->saveHTML();    

    return $content;
}

Beispiel HTML vor der Verarbeitung

<p><a href="http://example.com/">click</a></p>

<p>Lorem ipsum dolor sit amet, ecclesiam mittam est amet constanter approximavit te. Introivit gubernum defunctam vivum eum ego esse ait mea Christianis<br>
<a class="test-class test-other-class" href="http://example.com/1/">click me too</a> aedificatur ergo accipiet duxit ad te. Ascendi in modo invenit ubi diu requievit agi coepit. Apollonii appropinquat tation ulterius quod ait mea Christianis aedificatur ergo accipiet si mihi esse deprecor cum. Equidem deceptum in fuerat eum est in, quoque sed quod ait est in fuerat.</p>

<p><a data-test="55" href="http://example.com/2/">click me as well</a></p>

<p>Lorem ipsum dolor sit amet, ecclesiam mittam est amet constanter approximavit te. Introivit gubernum defunctam vivum eum ego esse ait mea Christianis aedificatur ergo accipiet duxit ad te. Ascendi in modo invenit ubi diu requievit agi coepit. Apollonii appropinquat tation ulterius quod ait mea Christianis aedificatur ergo accipiet si mihi esse deprecor cum. Equidem deceptum<br>
<a id="test-id" class="test-class" href="http://example.com/3/">clicky</a> in fuerat eum est in, quoque sed quod ait est in <a>This link has no href attribute</a> fuerat.</p>

Beispiel HTML nach der Verarbeitung

<p><a onclick="window.open( 'http://example.com/', '_blank', 'location=no' );">click</a></p>

<p>Lorem ipsum dolor sit amet, ecclesiam mittam est amet constanter approximavit te. Introivit gubernum defunctam vivum eum ego esse ait mea Christianis<br>
<a class="test-class test-other-class" onclick="window.open( 'http://example.com/1/', '_blank', 'location=no' );">click me too</a> aedificatur ergo accipiet duxit ad te. Ascendi in modo invenit ubi diu requievit agi coepit. Apollonii appropinquat tation ulterius quod ait mea Christianis aedificatur ergo accipiet si mihi esse deprecor cum. Equidem deceptum in fuerat eum est in, quoque sed quod ait est in fuerat.</p>

<p><a data-test="55" onclick="window.open( 'http://example.com/2/', '_blank', 'location=no' );">click me as well</a></p>

<p>Lorem ipsum dolor sit amet, ecclesiam mittam est amet constanter approximavit te. Introivit gubernum defunctam vivum eum ego esse ait mea Christianis aedificatur ergo accipiet duxit ad te. Ascendi in modo invenit ubi diu requievit agi coepit. Apollonii appropinquat tation ulterius quod ait mea Christianis aedificatur ergo accipiet si mihi esse deprecor cum. Equidem deceptum<br>
<a id="test-id" class="test-class" onclick="window.open( 'http://example.com/3/', '_blank', 'location=no' );">clicky</a> in fuerat eum est in, quoque sed quod ait est in <a>This link has no href attribute</a> fuerat.</p>
3
Dave Romsey

Es gibt verschiedene Plugins, die das automatisch erledigen. Eine davon ist "Externe Links in neuem Fenster öffnen" (hier zu finden https://wordpress.org/plugins/open-external-links-in-a-new-window/ ). Sie können wahrscheinlich andere finden, wenn Sie Plugins nach "externen Links" durchsuchen.

Ich benutze dies auf mehreren Websites, funktioniert gut.

Wenn Sie Ihren eigenen Code rollen möchten, schauen Sie sich einfach den Code an, den sie verwenden, da alle Plugins (normalerweise) Open Source sind. Aber warum das Rad neu erfinden?

0
Rick Hellewell