• задача — мне нужен список записей сайта, в которых вставлены ссылки на чужие сайты. в идеале — урл страницы своего сайта : список внешних ссылок.

    я могу написать запрос wp_query, а потом профильтровать контент каждой записи, но сдается мне это будет глупо.

    подскажет кто с sql запросом?

Просмотр 10 ответов — с 1 по 10 (всего 10)
  • Модератор Yuri

    (@yube)

    Как-то так

    
    SELECT * 
    FROM wp_posts
    WHERE post_type = 'post'
        AND post_content REGEXP '<a.*href=(\'|")(!?http://site.com).*(\'|")>' 
    

    (я в регулярках на уровне «знаю что они есть»)

    • Ответ изменён 5 лет, 6 месяцев назад пользователем Yuri.

    что-то оно у меня лишь одну запись находит.

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    MySQL, в отличие от MariaDB, не поддерживает negative lookahead.

    Можно попробовать так:

    
    SELECT * 
    FROM wp_posts
    WHERE post_type = 'post'
        AND post_content REGEXP '<a.*href=(\'|")http.*(\'|")>' 
        AND post_content NOT REGEXP '<a.*href=(\'|")http://site.com.*(\'|")>'
    

    Сергей, спасибо.
    а как-нибудь можно вывести не просто записи — а url записи и список найденных в ней ссылок?
    а то получил я список из 800 записей — и толку от этого что-то немного.

    Модератор Yuri

    (@yube)

    а как-нибудь можно вывести не просто записи

    Это уже второй вопрос 🙂
    Полученный от mysql список обработать в PHP/WP.
    Как-то так:

    
    $posts = $wpdb->ret_results($request);
    echo "<dl>";
    foreach($posts as $post) {
     echo "<dt><a href='" . get_premalink($post) . "'>" . get_the_title($post) . "</a></dt>";
    if ( preg_match_all('%(<a .*?href=(\'|\")(!?http://site.com)\\1.*?>(.+?)</a>)%uims', $post->post_content, $matches) ) {
       foreach ( $matches[1] as $m ) {
          echo "<dd>$m</dd>";
       }
     }
    }
    echo "</dl>";
    

    (очень грязный черновик, требующий доведения до ума)

    Юрий, спасибо.
    принцип понял, сейчас буду испытывать.

    с запросом к mysql не вышло — оно не дает записи, если там хоть одна ссылка на свой домен. так что пришлось все-таки вручную сравнивать. если кому понадобится подобное (вряд ли, но все-таки):

    
    <?php
    /*
    Plugin Name: Finding Links
    Description: Плагин поиска чужих ссылок в записях через шорткод [findlinks].
    Version: 1.00
    Author: Flector
    Author URI: https://profiles.wordpress.org/flector#content-plugins
    */ 
    
    function findlinks_shortcode($atts, $content) {
        extract(shortcode_atts(array(
            'type' => 'post',
            'url' => get_bloginfo('url'),
    	), $atts));
    
    global $wpdb;    
    $request = "
    SELECT * 
    FROM $wpdb->posts
    WHERE post_type = '{$type}'
        AND post_content REGEXP '<a.*href=(\'|\")http.*(\'|\")>'
    ";    
        
    $posts = $wpdb->get_results($request);
    
    echo '<h2>Тип записей: '.$type.'</h2>';
    echo "<dl>";
    foreach($posts as $post) {
        $temp = "<br /><dt><a href='" . get_permalink($post) . "'>" . get_the_title($post) . "</a> 
        <small>(<a target='new' href='".get_edit_post_link($post)."' />edit</a>)</small>
        </dt>";
    
        $i = 0; $temp2 = '';
        if (preg_match_all("/<a(.*?)href=\"(.*?)\"(.*?)>(.*?)<\/a>/i", $post->post_content, $res)) {
            foreach ($res[2] as $r) {
                if (strpos($r, $url) === false) {$temp2 .= "<dd>{$r}</dd>";$i++;}
            }    
        }
        if ($i > 0) {echo $temp.$temp2;}
    }
    echo "</dl>";
    }
    add_shortcode('findlinks', 'findlinks_shortcode');
    

    Сергей, Юрий — спасибо!

    Atrax

    (@atrax)

    Ethical engineer

    — Модераторы знают о чем речь

    @flector
    Не считайте себя бессмертным.
    За переход на личности блокировать вас буду я.

    Не считайте себя бессмертным.
    За переход на личности блокировать вас буду я.

    я вот даже не знаю, как на это реагировать.
    пострадал от неадекватного модератора я, но вместо извинений сплошные угрозы.

    Atrax

    (@atrax)

    Ethical engineer

    Как хотите, так и реагируйте.
    Но следующее оскорбление в адрес любого участника будет последним.

Просмотр 10 ответов — с 1 по 10 (всего 10)
  • Тема «запрос к mysql» закрыта для новых ответов.