Модератор
Yuri
(@yube)
Как-то так
SELECT *
FROM wp_posts
WHERE post_type = 'post'
AND post_content REGEXP '<a.*href=(\'|")(!?http://site.com).*(\'|")>'
(я в регулярках на уровне «знаю что они есть»)
-
Ответ изменён 4 года, 6 месяцев назад пользователем
Yuri.
что-то оно у меня лишь одну запись находит.
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
Как хотите, так и реагируйте.
Но следующее оскорбление в адрес любого участника будет последним.