WordPress搜索自定义文章类型post_type等

post_type直接使用 Custom Post Type Maker 创建和管理,可以控制是否对默认全站搜索可见。

如何限定只在自定义post_type中进行搜索呢?

WordPress搜索是支持post_type参数的,我们可以通过定制theme里的searchform.php定制下搜索框给加上这个post_type参数即可,可以通过下拉菜单或者radio标签等来控制这个参数。

比如下面这样

<?php $post_type_q = get_query_var ( 'post_type' ); ?>
<input type="radio" name="post_type" value="any" <?php echo $post_type_q=='any'?'checked':'';?> >全站
<input type="radio" name="post_type" value="post" <?php echo $post_type_q=='post'?'checked':'';?> >文章
<input type="radio" name="post_type" value="product" <?php echo $post_type_q=='product'?'checked':'';?> >产品

如何合并全文搜索和某个自定义post_meta搜索呢?

用下面三个filter控制吧,仅在搜索product时搜索这个barcode这个meta信息。

function add_join_include_barcode($joins) {
 if ( !is_admin()) {
  global $wpdb;
  if ( isset( $_GET['post_type'] ) && !empty( $_GET['post_type'] ) && $_GET['post_type'] == 'product' ) {
   $joins = $joins . " INNER JOIN {$wpdb->postmeta} ON ({$wpdb->posts}.ID = {$wpdb->postmeta}.post_id)" ;
  }
 }
 return $joins;
}
function add_where_include_barcode($where) {
 if ( !is_admin()) {
  global $wpdb;
  if ( isset( $_GET['post_type'] ) && !empty( $_GET['post_type'] ) && $_GET['post_type'] == 'product' ) {
   $where.= " OR ({$wpdb->postmeta}.meta_key='barcode' AND {$wpdb->postmeta}.meta_value like '%".esc_sql( $_GET['s'])."%')";
  }
 }
 return $where;
}
add_filter('posts_join','add_join_include_barcode');
add_filter('posts_where','add_where_include_barcode');
function search_distinct() {
 return "DISTINCT";
}
add_filter('posts_distinct', 'search_distinct');

新建文章自动添加meta信息字段

add_action( 'add_meta_boxes_product', 'add_product_meta_data' );
function add_product_meta_data( WP_Post $cf ) {
    // Add the meta data you want the custom post type to have
    $cf_meta_data = [
        'barcode',
    ];

    foreach ( $cf_meta_data as $meta ) {
        add_post_meta( $cf->ID, $meta, '', true );
    }
}

用单选框复选框形式修改某taxonomy

先通过注册add_meta_boxes这个action创建输入框,还需要注册save_post这个action来保存此meta信息。


function product_seller_meta_box_markup($object)
{
    wp_nonce_field(basename(__FILE__), "meta-box-nonce");
    ?>
<div>
<form>
    <?php 
    $sellerterms = get_the_terms( $post->ID, 'seller' );
    $seller = null;
    if ( ! empty( $sellerterms ) && ! is_wp_error( $sellerterms ) ) {
        $seller = $sellerterms[0]->name;
    }
    $allsellers = array('狗家','猫家','狮家');
    for($i = 0; $i < count($allprices); ++$i) {
        echo '<input type="radio" name="product_seller" value="'.$allsellers [$i].'"'.($seller==$allsellers[$i]?' checked ':'').'>'.$allsellers[$i].'<br>';
    }
    ?>
    </form>
</div>
<?php
}
function add_meta_box_seller() {
  add_meta_box("seller-meta-box", "卖家", "product_seller_meta_box_markup", "product", "side", "low", null);
}
add_action("add_meta_boxes", "add_meta_box_seller"); 

function save_product_seller($post_id, $post, $update) {
  if (!isset($_POST["meta-box-nonce"]) || !wp_verify_nonce($_POST["meta-box-nonce"], basename(__FILE__))) return $post_id;
  if(!current_user_can("edit_post", $post_id)) return $post_id;
  if(defined("DOING_AUTOSAVE") && DOING_AUTOSAVE) return $post_id;

  if('product' != $post->post_type)
    return $post_id;

  $seller = null;

  if(isset($_POST["product_seller"]))
  {
    $seller = $_POST["product_seller"];
  }
  if ($seller!==null) wp_set_object_terms( $post_id, $seller , 'seller' );
}

add_action("save_post", "save_product_seller", 10, 3);

 

WordPress上传文件是http还是https的呢?

使用ImageElevator插件等上传完图片插入的图片的链接是http地址,而如果我们站点启用了https并通过https访问时,图片就不是通过https的啦。
这是需要使用不带schema的地址形式。

方案一,设置这个wp-option

upload_url_path为不带schema的相对路径(域名可选)。
参考定义在wp-includes/functions.php中的_wp_upload_dir函数。
这个可行, 暂时用这个。
继续阅读WordPress上传文件是http还是https的呢?