запрос к mysql
-
задача — мне нужен список записей сайта, в которых вставлены ссылки на чужие сайты. в идеале — урл страницы своего сайта : список внешних ссылок.
я могу написать запрос wp_query, а потом профильтровать контент каждой записи, но сдается мне это будет глупо.
подскажет кто с sql запросом?
-
Как-то так
SELECT * FROM wp_posts WHERE post_type = 'post' AND post_content REGEXP '<a.*href=(\'|")(!?http://site.com).*(\'|")>'(я в регулярках на уровне «знаю что они есть»)
-
Ответ изменён 7 лет, 4 месяца назад пользователем
Юрій.
что-то оно у меня лишь одну запись находит.
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 записей — и толку от этого что-то немного.а как-нибудь можно вывести не просто записи
Это уже второй вопрос 🙂
Полученный от 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');Сергей, Юрий — спасибо!
— Модераторы знают о чем речь
@flector
Не считайте себя бессмертным.
За переход на личности блокировать вас буду я.Не считайте себя бессмертным.
За переход на личности блокировать вас буду я.я вот даже не знаю, как на это реагировать.
пострадал от неадекватного модератора я, но вместо извинений сплошные угрозы.Как хотите, так и реагируйте.
Но следующее оскорбление в адрес любого участника будет последним. -
Ответ изменён 7 лет, 4 месяца назад пользователем
Тема «запрос к mysql» закрыта для новых ответов.