Захват, сколько Сообщений к Месяцу для Виджета Панели инструментов

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

Я знаю, как создать виджет панели инструментов и все, что с количествами сообщения, отправьте количества типа.

У меня даже есть пользовательский, который перечисляет новые типы сообщения, которые я имею. Но я должен все же создать один только с подсчетом сколько сообщений или типов сообщения, там находятся через месяц, и я просто не уверен, как сделать это.

Любые идеи и справка на этом были бы потрясающими.Спасибо.:)

Я хотел бы, чтобы это было подобно чему-то вроде этого:

This is how i would like it to look like.

Это - обновление со сценарием ниже. Однако я не могу заставить это работать.

add_action('wp_dashboard_setup', 'dashboard_test');

function dashboard_test() {
global $wp_meta_boxes;

wp_add_dashboard_widget('month_dashboard', 'Reports Submitted for the Year',   'custom_test');
}

function custom_test() {
global $wpdb;
$years = $wpdb->get_col("SELECT DISTINCT YEAR(post_date) FROM $wpdb->posts WHERE   post_status = 'publish' AND post_type = 'report' ORDER BY post_date DESC");

foreach($years as $year) 

    $months = $wpdb->get_col("SELECT DISTINCT MONTH(post_date) FROM $wpdb->posts WHERE post_status = 'publish' AND post_type = 'report' AND YEAR(post_date) = '".$year."' ORDER BY post_date DESC");

    foreach($months as $month)  

            if ($month < 10)
            {
                $month = '0' . $month; 
            } 

            $theids = $wpdb->get_results("SELECT ID, post_title FROM $wpdb->posts WHERE post_status = 'publish' AND post_type = 'report' AND MONTH(post_date)= '".$month."' AND YEAR(post_date) = '".$year."' ORDER BY post_date ASC");

            echo '<h4>';

                        echo '<li><a href="/report/'.$year.'/'.$month.'">' . date( 'F', mktime(0, 0, 0, $month) ). ' (' . count($theids) . ')</a></li>' ;

                echo '</h4>';

}

Я получаю эту ошибку: Звоните в функцию членства get_col () на необъекте в/var/www/vhosts/hibsterlite.com/httpdocs/wp-content/themes/hibsterlite/functions ‌​. php на строке 209

Хорошо я больше не получаю ошибку выше однако, я только добираюсь, один месяц перечислил банкомат. Какие-либо парни идей?:)

0
23.03.2018, 18:16
3 ответа

Просто Пробежался через Ваш код, и он выглядит хорошо, но Вы пропускаете блоки кода для своих циклов foreach так:

add_action('wp_dashboard_setup', 'dashboard_test');
function dashboard_test() {
    global $wp_meta_boxes;
    wp_add_dashboard_widget('month_dashboard', 'Reports Submitted for the Year',   'custom_test');
}

function custom_test(){
    global $wpdb;
    $years = $wpdb->get_col("SELECT DISTINCT YEAR(post_date) FROM $wpdb->posts WHERE   post_status = 'publish' AND post_type = 'report' ORDER BY post_date DESC");
    foreach($years as $year){
        $months = $wpdb->get_col("SELECT DISTINCT MONTH(post_date) FROM $wpdb->posts WHERE post_status = 'publish' AND post_type = 'report' AND YEAR(post_date) = '".$year."' ORDER BY post_date DESC");
        foreach($months as $month) {
            $month = ($month < 10)? '0' . $month : $month; 
            $theids = $wpdb->get_results("SELECT ID, post_title FROM $wpdb->posts WHERE post_status = 'publish' AND post_type = 'report' AND MONTH(post_date)= '".$month."' AND YEAR(post_date) = '".$year."' ORDER BY post_date ASC");
            echo '<h4>';
            echo '<li><a href="/report/'.$year.'/'.$month.'">' . date( 'F', mktime(0, 0, 0, $month) ). ' (' . count($theids) . ')</a></li>' ;
            echo '</h4>';
        }
    }
}

и это работает просто великолепно:

enter image description here

3
19.02.2020, 23:38
  • 1
    . Я знал, что забывал что-то, что я просто не мог выяснить, каково это было. Я действительно ценю его. Снова спасибо. :) –  Nicole 08.10.2012, 17:13

Я реализовал что-то подобное для пользовательского архива типа сообщения, потому что мне не нравилась обработка wp_get_archives. В основном я создал пользовательский запрос SQL для всех сообщений через год, затем сломал это к месяцу, затем выполнил количество сообщений каждый месяц.

<ul>

    <?php

    $years = $wpdb->get_col("SELECT DISTINCT YEAR(post_date) FROM $wpdb->posts WHERE post_status = 'publish' AND post_type = 'mediaposts' ORDER BY post_date DESC");

    foreach($years as $year) :

        $months = $wpdb->get_col("SELECT DISTINCT MONTH(post_date) FROM $wpdb->posts WHERE post_status = 'publish' AND post_type = 'mediaposts' AND YEAR(post_date) = '".$year."' ORDER BY post_date DESC");

            foreach($months as $month) : 

                if ($month < 10)
                {
                    $month = '0' . $month; 
                } 

                $theids = $wpdb->get_results("SELECT ID, post_title FROM $wpdb->posts WHERE post_status = 'publish' AND post_type = 'mediaposts' AND MONTH(post_date)= '".$month."' AND YEAR(post_date) = '".$year."' ORDER BY post_date ASC");

                    ?>

                    <h4>
                        <?php 
                            echo '<li><a href="/mediaposts/'.$year.'/'.$month.'">' . date( 'F', mktime(0, 0, 0, $month) ). ' (' . count($theids) . ')</a></li>' ;
                        ?>
                    </h4>
            <?php  

            endforeach;?>

    <?php 

    endforeach;

    ?>

</ul>

Это - конечный результат:

Custom Query end result

1
19.02.2020, 23:38
  • 1
    , к сожалению, я попробовал Ваш ответ, но получил ошибку базы данных при реализации его. Я получаю эту ошибочную Фатальную ошибку: Звоните в функцию членства get_col () на необъекте в/var/www/vhosts/hibsterlite.com/httpdocs/wp-content/themes/hibsterlite/functions.php на строке 209 –  Nicole 04.10.2012, 00:00
  • 2
    Мои извинения. Попытайтесь поместить это перед кодом: глобальный $wpdb; –  Jonathan 04.10.2012, 00:06
  • 3
    Кроме того, к концу можно хотеть скорректировать ссылку, которую он создает. Я сделал этот отрывок для создания архива пользовательских типов сообщения. Изменение <href = "/mediaposts / '. $year. '/'. $month'. "> к <href =" / '. $year. '/'. $month'. "> должен направить Вас к Вашей странице –  Jonathan 04.10.2012, 00:09
  • 4
    ха-ха! Вы сэр являетесь гением.:) Спасибо. Однако я только отображал один месяц. Который является только сентябрем, у меня также есть сообщения в октябре. –  Nicole 04.10.2012, 00:19
  • 5
    хм... только для ударов. Добавьте новую строку, прежде чем глобальные $wpdb и сбросят запрос: <? php wp_reset_query ();?> Только для проверки это не затрагивается другим запросом –  Jonathan 04.10.2012, 00:26

Я использовал бы больше PHP, чем SQL. Таким образом, только необходимо поразить базу данных однажды для сообщений.

Добавьте новый виджет Панели инструментов WordPress.

/* Add a Dashboard widget for reports submitted. */
function mbe_add_dashboard_widget(){
    wp_add_dashboard_widget('mbe_dashboard_widget_reports', 'Reports Submitted',   'mbe_dashboard_widget_reports');
}
add_action('wp_dashboard_setup', 'mbe_add_dashboard_widget');

Установите фактический виджет Панели инструментов WordPress для всех представленных отчетов.

/* Reports Submitted Widget. */
function mbe_dashboard_widget_reports(){
    $data = mbe_get_reports();
    if($data){
        echo '<table style="width: 100%;">'.PHP_EOL;
        echo '<tr>'.PHP_EOL;
        echo '<td style="width: 33%;"><strong>Reports by Year</strong></td>'.PHP_EOL;
        echo '<td style="width: 33%;"><strong>Reports by Month</strong></td>'.PHP_EOL;
        echo '<td style="width: 33%;"><strong>Reports by Day</strong></td>'.PHP_EOL;
        echo '</tr>'.PHP_EOL;
        echo '<tr>'.PHP_EOL;
        echo '<td style="vertical-align: text-top;">'.mbe_reports_by('year', $data).'</td>'.PHP_EOL;// Yearly
        echo '<td style="vertical-align: text-top;">'.mbe_reports_by('month', $data).'</td>'.PHP_EOL;// Monthly
        echo '<td style="vertical-align: text-top;">'.mbe_reports_by('day', $data).'</td>'.PHP_EOL;// Daily
        echo '</tr>'.PHP_EOL;
        echo '</table>'.PHP_EOL;
    }
}

Основная функция, которая будет использоваться для выборки Вашего первоначального WordPress, отправляет данные для представленных отчетов.

/* Get all reports. */
function mbe_get_reports(){
    global $wpdb;

    /* Prevent typos later on. */
    $post_type = 'report';
    $post_status = 'publish';

    $posts = $wpdb->get_results($wpdb->prepare(
        "
        SELECT ID, post_title, post_date
        FROM {$wpdb->posts}
        WHERE `post_status` = '%s'
        AND `post_type` = '%s'
        ",
        $post_status,
        $post_type
    ));

    /* No posts. */
    if(empty($posts)){
        return false;
    }

    $post_data = array(); // Store data for later.
    for($i = 0; $i < count($posts); $i++){
        $post = $posts[$i];
        /* Separate the date from the time. */
        $post_date = explode(' ', $post->post_date);
        /* Separate the day, month, and year from each other. */
        $the_date = explode('-', $post_date[0]);
        $month = date('F', mktime(0, 0, 0, $the_date[1]));
        $day = date('l', mktime(0, 0, 0, $the_date[2]));
        /* Store post data nested in the format: year, month, day. */
        $post_data[$the_date[0]][$month][$day][] = array(
            'post_id' => $post->ID,
            'post_title' => $post->post_title,
            'post_slug' => sanitize_title($post->post_title),
            'post_permalink' => get_permalink($post->ID),
            'post_type' => $post_type,
            'post_status' => $post_status,
            'post_date' => date('l, F d, Y', strtotime(join('-', $the_date))),// Ex. Saturday, October 06, 2012
            'post_time' => date('g:i A', strtotime($post_date[1]))// Ex. 3:00 PM
        );  
    }

    /* Done with $posts, remove it. */
    unset($posts);

    /* Return the data. */
    if(!empty($post_data)){
        $return = $post_data;
    } else{
        $return = false;
    }

    return $return;

}

Отсортируйте свои отчеты к году, месяцу, и дню, затем отобразите их в незаказанном списке в таблице Вашего виджета Панели инструментов WordPress.

/* Display report counts by year, month, or day. */
function mbe_reports_by($span, $data){
    $post_data = array();
    foreach($data as $year => $year_data){
        foreach($year_data as $month => $month_data){
            foreach($month_data as $day => $day_data){
                for($i = 0; $i < count($day_data); $i++){
                    $post = $day_data[$i];
                    if($span == 'year'){
                        $post_data[$year][] = $post;
                    } elseif($span == 'month'){
                        $post_data[$month][] = $post;
                    } elseif($span == 'day'){
                        $post_data[$day][] = $post;
                    }
                }
            }
        }
    }
    if(!empty($post_data)){
        $content = '';
        $content .= '<ul>'.PHP_EOL;
        uksort($post_data, 'mbe_date_sort');
        foreach($post_data as $time_span => $posts){
            $content .= '<li>'.$time_span.' (<a title="View posts in '.$time_span.'" href="'.admin_url('/edit.php?post_type=report', 'http').'">'.count($posts).'</a>)</li>'.PHP_EOL;
        }
        $content .= '</ul>'.PHP_EOL;
        $return = $content;
    } else{
        $content = '<p>No reports found.</p>'.PHP_EOL;  
    }
    return $content;
}

Вместо того, что смешали даты в произвольном порядке, они должны быть отсортированы. Мы не можем только отсортировать даты в порядке возрастания или убывания, мы должны отсортировать их в хронологическом порядке.

/* Sort dates chronologically. */
function mbe_date_sort($a, $b){
    if($a == $b){ 
        return 0; 
    } else{  
        $a = strtotime($a); 
        $b = strtotime($b); 
        if($a < $b){ 
            return -1; 
        } else{ 
            return 1; 
        } 
    } 
}

Если Вы хотели связать все гиперссылками свои количества отчета для списка всех сообщений с того года, месяца или дня... Я советовал бы присоединять три пользовательских taxonomies к Вашему "отчету" пользовательский тип сообщения.

Вам будет нужна пользовательская таксономия для "отчетов к году", "сообщает к месяцу", и "отчетам днем", и они должны будут быть присоединены к Вашему "отчету" пользовательский тип сообщения. Можно сделать это с register_taxonomy();

Необходимо было бы затем заполнить каждый из недавно созданных taxonomies с условиями. Каждый термин был бы отражением, это - соответствующая таксономия.

  • "reports_by_year" пользовательская таксономия, должен был бы содержать условия в течение каждого из лет, в течение которых был сгенерирован отчет (Исключая: 2009, 2010, 2011, 2012).
  • "reports_by_month" пользовательская таксономия, должен был бы содержать условия в течение каждого из месяцев через год (Исключая: с января по декабрь).
  • "reports_by_day" пользовательская таксономия, должен был бы содержать условия в течение каждого изо дней через неделю (Исключая: с воскресенья по субботу).

Каждый раз, когда отчет сгенерирован, он должен был бы автоматически установить надлежащие сроки в каждой пользовательской таксономии. Это могло быть сделано с помощью wp_set_object_terms(); и save_post рычаг действия. Узнайте больше о действиях WordPress.

После того как это заботилось о, Вы могли использовать это в качестве гиперссылки для количества отчетов.

  • Свяжитесь с отчетами с того года:
    admin_url('/edit.php?reports_by_year='.$time_span.'&post_type=report&orderby=title&order=asc', 'http');
  • Свяжитесь с отчетами с того месяца:
    admin_url('/edit.php?reports_by_month='.$time_span.'&post_type=report&orderby=title&order=asc', 'http');
  • Свяжитесь с отчетами с того дня:
    admin_url('/edit.php?reports_by_day='.$time_span.'&post_type=report&orderby=title&order=asc', 'http');

Таким образом, при нажатии на количество отчетов оно принесло бы Вам к таблице, содержащей только отчеты, сгенерированные в тот год, месяц или день, и будет отсортировано в порядке возрастания заголовком отчета.

1
19.02.2020, 23:38

Теги

Похожие вопросы