[Помогите] Как найти посты без картинок?

Тема в разделе "Wordpress", создана пользователем Ewsen, 11 апр 2012.

Статус темы:
Закрыта.
Модераторы: Sorcus
  1. Ewsen

    Ewsen

    Регистр.:
    26 июл 2008
    Сообщения:
    163
    Симпатии:
    59
    Есть плагин Search Regex который ищет посты с совпадением. Например, поиск '<img.*>' выведет посты где есть картинка, но как найти посты без картинок?

    Может есть какой нибудь другой плагин для этого? Подскажите решение
     
    recasher2k12 нравится это.
  2. recasher2k12

    recasher2k12

    Регистр.:
    19 фев 2012
    Сообщения:
    156
    Симпатии:
    78
    Если нужно быстрое решение, я бы нашел функцию preg_match в плагине и для ее обратного действия добавил ! перед preg_match,
    то есть получится что-то вроде
    !preg_match($mask, $matches)
     
  3. Ewsen

    Ewsen

    Регистр.:
    26 июл 2008
    Сообщения:
    163
    Симпатии:
    59
    В плагине есть такая функция
    PHP:
    function matches ($pattern$content$id)
        {
            if (
    preg_match_all ($pattern.$this->regex_options$content$matchesPREG_OFFSET_CAPTURE) > 0)
            {
                
    $results = array ();
            
                
    // We found something
                
    foreach ($matches[0] AS $found)
                {
                    
    $result = new Result ();
                    
    $result->id $id;

                    
    $result->offset $found[1];
                    
    $result->length strlen ($found[0]);
                    
                    
    // Extract the context - surrounding 40 characters either side
                    // Index 0 is the match, index 1 is the position
                    
    $start $found[1] - 40;
                    if (
    $start 0)
                        
    $start 0;
            
                    
    $end $found[1] + 40;
                    if (
    $end strlen ($content))
                        
    $end strlen ($content);

                    
    $end -= $start;

                    
    $left  substr ($content$start$found[1] - $start);
                    
    $right substr ($content$found[1] + strlen ($found[0]), $end);
                    
                    
    $result->left        $start;
                    
    $result->left_length strlen ($found[0]) + ($found[1] - $start) + $end;

                    if (
    $start != 0)
                        
    $result->search '&hellip; ';
                        
                    
    $result->search .= htmlspecialchars ($leftHTML_ENTITIES'UTF-8');
                    
    $result->search .= '<a title="'.__ ('edit').'" onclick="return false;" ondblclick="regex_edit(\''.get_class ($this).'\','.$result->id.','.$result->offset.','.$result->length.'); return false" href="#">';
                    
    $result->search .= htmlspecialchars ($found[0], HTML_ENTITIES'UTF-8').'</a>';
                    
    $result->search .= htmlspecialchars ($rightHTML_ENTITIES'UTF-8');
                    
                    
    $result->search_plain htmlspecialchars ($leftHTML_ENTITIES'UTF-8');
                    
    $result->search_plain .= htmlspecialchars ($found[0], HTML_ENTITIES'UTF-8');
                    
    $result->search_plain .= htmlspecialchars ($rightHTML_ENTITIES'UTF-8');
                    
                    if (
    $start $end strlen ($content))
                        
    $result->search .= ' &hellip;';
            
                    if (!
    is_null ($this->replace))
                    {
                        
    // Produce preview
                        
    $rep preg_replace ($pattern.$this->regex_options$this->replace$found[0]);
                        
    $result->replace_string $rep;
                    
                        if (
    $start != 0)
                            
    $result->replace '&hellip; ';
                            
                        
    $result->replace .= htmlspecialchars ($leftHTML_ENTITIES'UTF-8');
                        
    $result->replace .= '<a title="'.__ ('edit').'" onclick="return false;" ondblclick="regex_edit_replace(\''.get_class ($this).'\','.$result->id.','.$result->offset.','.$result->length.'); return false" href="#">';
                        if (
    $rep != '')
                             
    $result->replace .= '<strong>'.htmlspecialchars ($repHTML_ENTITIES'UTF-8').'</strong></a>';
                        else
                            
    $result->replace .= '<strong>['.__ ('deleted','search-regex').']</strong></a>';
                        
    $result->replace .= htmlspecialchars ($rightHTML_ENTITIES'UTF-8');
                        
                        
    $result->left_length_replace strlen ($left) + strlen ($rep) + strlen ($right) + 1;
                        
                        
    $result->replace_plain  htmlspecialchars ($leftHTML_ENTITIES'UTF-8');
                        
    $result->replace_plain .= htmlspecialchars ($repHTML_ENTITIES'UTF-8');
                        
    $result->replace_plain .= htmlspecialchars ($rightHTML_ENTITIES'UTF-8');
                        
                        if (
    $start $end strlen ($content))
                            
    $result->replace .= ' &hellip;';
                            
                        
    // And the real thing
                        
    $result->content preg_replace ($pattern.$this->regex_options$this->replace$content);
                    }

                    
    $results[] = $result;
                }

                return 
    $results;
            }
            return 
    false;
        }
    Поставил так
    !preg_match_all ($pattern.$this->regex_options, $content, $matches, PREG_OFFSET_CAPTURE) > 0)

    Не помогло. Результатов нет вообще, хотя посты без картинок есть
     
  4. recasher2k12

    recasher2k12

    Регистр.:
    19 фев 2012
    Сообщения:
    156
    Симпатии:
    78
    Да, preg_match_all работает по другому нежели preg_match.


    Короче, выбрать посты без картинок проще без плагинов:
    Код:
    $querystr = "
        SELECT wposts.*
        FROM {$wpdb->posts} wposts, {$wpdb->postmeta} wpostmeta
        WHERE wposts.ID = wpostmeta.post_id
           AND wposts.post_status = 'publish'
           AND wposts.post_type = 'post'
           AND NOT ( wposts.post_content RLIKE  "<img.*>")
        ORDER BY wposts.post_date DESC
    ";
    $pageposts = $wpdb->get_results($querystr, OBJECT);
     
    foreach ($pageposts as $post): {
    setup_postdata($post);
    ?>
     
       Здесь шаблон вывода поста, например:
           <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
     
    <?php
    endforeach;
     
  5. Ewsen

    Ewsen

    Регистр.:
    26 июл 2008
    Сообщения:
    163
    Симпатии:
    59
    У меня не работает этот код. Wordpress 3.3.1

    Вообще желательно научить плагин Search Regex этому. Очень удобно было бы из админки найти такие посты (в том числе и неопубликованные) и добавить в них картинку (плагин выводит в админке список найденных статей с кнопками просмотра и редактирования)

    П.С. Также можно было бы найти посты, где забыл поставить тег <!--more--> для многих было бы полезна такая функция.

    П.П.С. Первому, кто добавит и выложит здесь этот плагин с таким функционалом в виде чекбокса "выводить где есть совпадения/выводить где нет совпадений" я заплачу 200вмр. Предложение актуально до 13.04.2012
     
  6. recasher2k12

    recasher2k12

    Регистр.:
    19 фев 2012
    Сообщения:
    156
    Симпатии:
    78
    Вот тебе регулярное выражение, которое выберит все посты, кроме содержащих в них картинки:
    Код:
    '/^(?>(?!(\<img.*src)).)*$/umi'
     
    Ewsen нравится это.
  7. Ewsen

    Ewsen

    Регистр.:
    26 июл 2008
    Сообщения:
    163
    Симпатии:
    59
    Не работает. Вы пробовали это применить в плагине?

    UPD
    Все победил.:yahoo: Регулярное выражение для плагина search regex, которое ищет и выводит все посты без картинок
    Код:
    '(?i)(?s)^(?!(.*<img .*>)).*'
    recasher2k12, за помощь спасибо. Т. к. твоя регулярка не работала в плагине, но помогла мне найти решение, скину тебе 100вмр. Кидай Rкошелек в личку
     
  8. recasher2k12

    recasher2k12

    Регистр.:
    19 фев 2012
    Сообщения:
    156
    Симпатии:
    78
    У меня работает,
    попробуй код:
    Код:
    <?php
     
    $text    = '
    first line without links
    sfsd flksjhdf l <img src="sddsf">
    third line';
     
     
    $pattern = '/^(?>(?!(\<img.*src)).)*$/umi';
    $result  = preg_match_all($pattern, $text, $matches);
    print_r($matches);
    Резальтат:
    Код:
    (
        [0] => Array
            (
                [0] =>
                [1] => first line without links
                [2] => third line
            )
     
        [1] => Array
            (
                [0] =>
                [1] =>
                [2] =>
            )
     
Статус темы:
Закрыта.