用于按元数据搜索页面的表单

时间:2020-01-26 作者:Floh

您好,我需要在一个wordpress页面的形式,用户可以搜索特定的元数据页面。

我找到了如何进行搜索:https://rudrastyh.com/wordpress/meta_query.html#query_meta_values

但我应该如何创建表单,然后用参数调用查询?然后显示搜索结果。

目前我的页面上有此表单:

<form action="../process.php" method="post" name="myForm"> <p>Name <input id="name" type="text" name="name" /> </p> <p>eMail <input id="email" type="text" name="email" /> </p> <input type="submit" value="Submit" /> </form>

不幸的是,我仍然没有找到解决办法。如果你能帮助我,那就太好了。

坦克斯弗洛

3 个回复
最合适的回答,由SO网友:Floh 整理而成

非常感谢你。与此同时,我发现了如何解决。我当前的代码如下:

class CustomSearch
{
  public function __construct()
  {
    add_action(\'init\', array($this, \'init\'));
    add_shortcode(\'custom_search\', array($this, \'shortcode_handler\'));
  }

  public function init()
  {
    if (!empty($_POST[\'nonce_custom_form\']))
    {
      if (!wp_verify_nonce($_POST[\'nonce_custom_form\'], \'handle_custom_form\'))
      {
        die(\'You are not authorized to perform this action.\');
      } else
      {
        $error = null;
        if (empty($_POST[\'workingLanguage\']) && empty($_POST[\'workingArea\']) )
        {
          $error = new WP_Error(\'empty_error\', __(\'Please enter search request.\', \'floh\'));
          wp_die($error->get_error_message(), __(\'CustomSearch Error\', \'floh\'));
        }
        else
        {
          $rd_args = array(
            \'post_type\' => \'page\',
            \'meta_query\' => array(
              \'relation\' => \'AND\',
              array(
                \'key\' => \'name\',
                \'value\' => $_POST[\'name\'],
                \'compare\' => \'LIKE\'
              ),
              array(
                \'key\' => \'email\',
                \'value\' => $_POST[\'email\'],
                \'compare\' => \'LIKE\'
              )
            )
          );
          $rd_query = new WP_Query( $rd_args );

          $posts = $rd_query->posts;

          // The Loop
          if( $rd_query->have_posts() ) {
            echo \'<ul>\';
            while ( $rd_query->have_posts() ) {
              $rd_query->the_post();
              echo \'<li>\'.get_the_title().\'</li>\';
            }
            echo \'</ul>\';
          } else {
            // no posts found
          }
        }
      }
    }
  }

  function shortcode_handler($atts)
  {
    return "<form method=\'post\' action=\'\'>
      <p>Name: <input name=\'name\' type=\'text\' value=\'\' /></p>
      <p>eMail: <input name=\'email\' type=\'text\' value=\'\' /></p>
      " . wp_nonce_field(\'handle_custom_form\', \'nonce_custom_form\') . "
      <input type=\'submit\' value=\'Submit\'/>
      </form>";
  }

}

$CustomSearch = new CustomSearch();
现在,我必须了解如何将列表附加到表单下方的searchpage。或者更好的是,如何将结果$rd\\U结果“发送”到默认搜索页面?

更新:我学会了使用return而不是echo,这样输出的顺序就正确了。(我不知道为什么我开始使用echo)

最佳regardsFloh

SO网友:Daniel Gross

看看https://developer.wordpress.org/reference/classes/wpdb/get_col/

在结果页面上,接收如下查询

<?php
if(isset($_POST[\'name\']) || isset($_POST[\'email\'])){
    $name = \'%\' . $wpdb->esc_like( $_POST[\'name\'] ) . \'%\';
    $email = \'%\' . $wpdb->esc_like( $_POST[\'email\'] ) . \'%\';

    global $wpdb;

    $prepare = $wpdb->get_col( $wpdb->prepare( " SELECT post_id FROM ".$wpdb->prefix."postmeta AS M WHERE M.meta_value LIKE \'%s\' OR M.meta_value LIKE \'%s\' ", $name, $email ) );
    $post_ids = array_unique($prepare);

    $search = array(
        \'post_type\' => \'any\',// or your post type
        \'post__in\' => $post_ids,
        \'post_status\' => array(\'publish\',\'private\',\'future\'),//or only \'publish\'
        \'nopaging\' => true,
        \'orderby\' => \'title\',
        \'order\' => \'ASC\',
        \'cache_results\' => false,
    );

    $result = new WP_Query($search);

    if($result->found_posts >= 1){
        while($result->have_posts()) : $result->the_post();
            global $post;
            //$permalink = get_permalink($post->ID);//If necessary
            echo get_post_meta( $post->ID, \'name\', true).\', \';
            echo get_post_meta( $post->ID, \'email\', true).\'<hr>\';
        endwhile;
        wp_reset_postdata();
    }else{
        echo \'Nothing here\';
    }
}else{
    echo \'Error: Fill the name or email\';
}
?>

SO网友:Floh

嗯,我找到了满足我要求的解决方案。我保留了刚才发布的PHP,但在ul元素中添加了一个id。然后,我在应用PHP代码的同一页面中添加了html元素和Javascript代码。我添加的HTML部分如下所示:

<div id="formattedresult" />
<script>
  var result = document.getElementById(\'customresult\');
  document.getElementById(\'formattedresult\').appendChild(result);
</script>
现在我必须把结果弄清楚,我要订一本Wordpress的书!很抱歉发布此主题。

我知道有更好的解决方案,但我必须学习更多关于Wordpress和PHP的知识。

顺致敬意,弗洛

相关推荐

按字母顺序对填充的GravityForms列表进行排序

希望有人能帮助一个新手,因为我不知道该怎么做。我的函数中有以下代码。填充GravityForms表单产品“复选框列表”的php。用户使用复选框在网站上选择GF表单中的产品。每个拉入复选框列表的产品都是一个单独的WordPress帖子。我很难按字母顺序对复选框进行排序,以便用户可以在100多个不同的产品(帖子)中轻松找到产品。我找不到任何其他看起来有点相似的论坛帖子,所以我可以自己解决如何排序。第一部分是按字母顺序对复选框进行排序,我需要的第二部分是排除两个标记为“系统”的帖子,或者排除这两个帖子,因为它们