添加自定义域并从POST表中查询

时间:2012-06-29 作者:blee908

我想弄清楚这件事已经有一段时间了。所以我尝试在每一篇文章中添加一个自定义的字段调用“counter”。我尝试简单地将字段“counter”插入到post表中。每次用户点击帖子上的一个按钮,它都会增加计数器。

但现在棘手的部分是能够通过WP\\u查询返回信息。我想对计数器大于0的帖子进行自定义查询,循环浏览帖子,并用模板标记显示它们。

如果我要写一个sql语句,它会是这样的

$query = "SELECT * FROM $wpdb->post WHERE counter > 0";
但我无法执行普通的SQL查询,因为这样我就无法访问模板标记,例如Wordpress的“显示下一页|显示旧页”模板标记。

我不是在寻找插件,但我正在尝试找到一种方法,可以在post表中添加一个字段,并能够根据自定义字段查询帖子,循环结果,并显示帖子的信息。如果你们有什么建议,我将不胜感激。

注意:我是否要将自定义字段添加到post meta?看看SQL表,它似乎不是一个合适的地方。。。

2 个回复
SO网友:Milo

在posts表中添加一列是个坏主意,这确实是Custom Fields (Post Meta) 用于。根据自定义字段的值对帖子进行查询和排序WP_Query 和apost meta (custom field) query:

$query = new WP_Query(
    array(
        \'meta_key\' => \'counter\',
        \'meta_value\' => 0,
        \'meta_compare\' => \'>\'
    )
);

SO网友:PayteR

Milo是对的,这是个坏主意,但我被迫在一个大网站上这样做,因为在未索引meta\\u值上的关系太慢了。下面是我的示例post_viewsUse it with caution and only if you are aware of what you are doing!

<?php


define("AMP_OPTION_VIEWS", \'_prefix_views\');


/**
 * Pridava funkie okolo pocitania zobrazeni a kliknuti pre posty
 */
function prefix_get_count($post_id = 0)
{
    $post = get_post($post_id);

    return isset($post->post_views) ? intval($post->post_views) : 0;
}

function prefix_set_count($views, $post_id = 0)
{
    global $wpdb;
    $post_id = $post_id ?: get_the_ID();

    if ($post_id) {
        $wpdb->query($wpdb->prepare("UPDATE " . $wpdb->posts . " SET post_views = %d WHERE ID = %d", $views, $post_id));
    }

    return !$wpdb->last_error;
}

function prefix_increment_count($post_id = 0)
{
    global $wpdb;
    $post_id = $post_id ?: get_the_ID();

    if ($post_id) {
        $wpdb->query($wpdb->prepare("UPDATE " . $wpdb->posts . " SET post_views = post_views + 1 WHERE ID = %d",
            $post_id));
    }

    return !$wpdb->last_error;
}


function prefix_posts_columns($defaults)
{
    if (current_user_can(\'edit_published_posts\')) {
        $defaults[AMP_OPTION_VIEWS] = __("Views");
    }

    return $defaults;
}

add_filter(\'manage_posts_columns\', __NAMESPACE__ . NAMESPACE_SEPARATOR . \'posts_columns\');

function prefix_posts_custom_column($column_name, $post_ID)
{
    if ($column_name == AMP_OPTION_VIEWS) {
        echo prefix_get_count($post_ID);
    }
}

add_action(\'manage_posts_custom_column\', __NAMESPACE__ . NAMESPACE_SEPARATOR . \'posts_custom_column\', 10, 2);

/**
 * This function will return most viewed posts
 *
 * @return WP_Query
 */
function get_most_views($args)
{
    global $wpdb;

    $args[\'suppress_filters\'] = false;
    $orderby_function = function ($orderby) {
        global $wpdb;

        return "{$wpdb->posts}.post_views DESC";
    };

    add_filter(\'posts_orderby\', $orderby_function);
    $return = new WP_Query( $args );

    if (stripos($wpdb->last_error, "posts.post_views\' in \'order clause\'") !== false) {
        global $wpdb;
        $exists = $wpdb->get_row("SELECT meta_id FROM {$wpdb->postmeta} WHERE meta_key = \'" . AMP_OPTION_VIEWS . "\' LIMIT 1");
        // zisti meta_key, ak je stara tema je iny
        $meta_key = $exists ? AMP_OPTION_VIEWS : \'_im_views\';

        // prida sa novy stlpec
        $add_views_column = "ALTER TABLE `{$wpdb->posts}` ADD COLUMN `post_views` INT NOT NULL DEFAULT \'0\';";
        $wpdb->query($add_views_column);

        // prida sa index pre stlpec
        $add_views_index = "ALTER TABLE `{$wpdb->posts}` ADD INDEX `post_views` (`post_views`);";
        $wpdb->query($add_views_index);

        // updatnu sa views z metadat
        $update_values = "UPDATE {$wpdb->posts} 
      SET post_views = IFNULL((SELECT meta_value FROM {$wpdb->postmeta} 
      WHERE post_id = ID AND meta_key = \'{$meta_key}\' LIMIT 1), 0);";
        $wpdb->query($update_values);

        // vymazu sa zbytocne metadata
        if (!$wpdb->last_error) {
            $update_values = "DELETE FROM {$wpdb->postmeta} WHERE meta_key = \'{$meta_key}\'";
            $wpdb->query($update_values);
        }

        $return = new WP_Query( $args );
    }
    remove_filter(\'posts_orderby\', $orderby_function);

    return $return;
}

function prefix_ajax()
{
    $post_id = $_POST[\'postID\'];

    $result = prefix_increment_count($post_id);

    echo $result ? "ok" : "fail";
    exit;
}

add_action("wp_ajax_nopriv_amp_views", __NAMESPACE__ . NAMESPACE_SEPARATOR . \'ajax\');
add_action("wp_ajax_amp_views", __NAMESPACE__ . NAMESPACE_SEPARATOR . \'ajax\');

结束

相关推荐

Switching database on the fly

我读过here 关于使用动态切换当前wp数据库$wpdb->select(\'database_name\'); 一旦完成,我理解我将不得不向原始数据库发出相同的语句。问题:更改数据库后,我是否需要刷新缓存或类似的东西才能正常工作?我需要再次呼叫WP标头吗?潜在问题?